Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
WIKIPEDIA
/
imaliapi
/
app
/
Http
/
Controllers
:
PaymentController.php
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php namespace App\Http\Controllers; use App\AllTransaction; use App\Bank\HistoryPayment; use App\Bank\MasterAccount; use App\Bank\Payment; use App\Bank\Profit; use App\BeginSolicitation; use App\Classes\Auth as ClassesAuth; use App\Classes\Kyc; use App\Classes\FCMNotifcation; use App\Classes\ImageUploader; use App\Classes\PaymentKyc; use App\Classes\PushNotification; use App\Classes\Record; use App\Classes\SendResponse; use App\Classes\SendSMS; use App\Classes\SendSMSSislog; use App\Classes\SmsManager; use App\Classes\StoreKyc; use App\Classes\TransactionGeneration; use App\Classes\UserKyc; use App\Http\Controllers\Api\Auth\LoginController; use App\Imali\BusinessAccount; use App\Imali\ImaliAccount; use App\Imali\ImaliAccountConfig; use App\Imali\MerchantAccount; use App\Imali\MerchantContract; use App\Imali\RamoActivity; use App\Imali\RechargeImaliAccount; use App\Imali\Transfer; use App\Mail\Pagamento; use App\Mail\PagamentoConfirmado; use App\MoneyRequest; use App\PrepaidCardDeposit; use App\PurchaseVoucher; use App\Store; use Google\Client as GoogleClient; use App\StoreAmountGeneration; use App\StoreConfig; use App\StoreDevice; use App\SubAccountType; use App\TransactionHistory; use App\TransferHistory; use App\User; use App\WithdrawalsRequest; use Illuminate\Http\Request; //use DB; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Log; use QRCode; use App\ImaliTariff; use App\Link; use App\PaymentRequest; use App\PaymentType; use App\PushPaymentRequest; use App\Qrcode as AppQrcode; use App\UserClient; use DateTime; class PaymentController extends Controller { protected $request; protected $createTransaction; protected $generatedTransaction; protected $log; protected $trasactionGeneration; protected SmsManager $smsManager; public function __construct() { $this->log = new Record(); $this->trasactionGeneration = new TransactionGeneration(); $this->smsManager = new SmsManager(); } public function getExtrato() { $user = User::query() ->join('imali_accounts', 'imali_accounts.user_id', '=', 'users.id') ->leftJoin('credelecs', 'credelecs.user_id', '=', 'users.id') ->leftJoin('payments', 'payments.sender_id', '=', 'users.id') ->where('users.id', 1) ->select('credelecs.*', 'payments.*') ->get(); return response()->json($user); } public function getTesteTransaction($id) { $u = Payment::query()->where('sender_id', '=', 1)->get(); $transactons = DB::table('payments') ->join('history_payments', 'history_payments.user_id', '=', 'payments.sender_id') ->where('payments.sender_id', $id) ->where('history_payments.user_id', $id) ->select('payments.*', 'history_payments.status_user as type') ->orderBy('payments.created_at', 'desc') ->get(); return response()->json($transactons); } public function getUser($id) { $user = User::query()->where('user_id', $id)->first(); return response()->json($user); } public function getMyTransactions($id) { // $user = User::query()->where('user_id', $id)->first(); $transactons = DB::table('users') ->join('payments', 'users.id', '=', 'payments.sender_id') ->where('user_id', $id) ->select('payments.*') ->orderBy('created_at', 'desc') ->get(); return response()->json(['data' => $transactons], 200, [], JSON_NUMERIC_CHECK); } public function makePayment(Request $request) { $trasactionGeneration = new TransactionGeneration(); $payerUser = User::query()->where('user_id', $request->user_id)->first(); $comerciante = MerchantAccount::query()->where('account_number', $request->account_number)->first(); $payer_id = $payerUser->id; $imali = ImaliAccount::query()->where('user_id', $payer_id)->first(); $kyc = new Kyc(); $kycCheck = $kyc->checkSenderPayment($request); if ($kycCheck) { $log = new Record(); $log->createLog([ 'description' => $imali->account_number . ' ' . $comerciante->name, 'details' => $kycCheck, 'operation' => 'Payment', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'status' => 'Error', 'user_id' => $request->user()->id ]); return $kycCheck; } else { if ($payerUser) { if ($imali->balance < $request->amount) { $log = new Record(); $log->createLog([ 'description' => $imali->account_number . ' ' . $comerciante->name, 'details' => 'Saldo Insuficiente', 'operation' => 'Payment', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'status' => 'Error', 'user_id' => $request->user()->id ]); return response()->json(['message' => 'Saldo insuficiente', 'class' => 'error'], 402, [], JSON_NUMERIC_CHECK); } else { $valorAPagar = $request->amount; $points = round($valorAPagar); // Payer or Sender Section DB::table('imali_accounts')->where('user_id', $payer_id)->decrement('balance', $valorAPagar); DB::table('imali_accounts')->where('user_id', $payer_id)->increment('points', $points); $contractoComerciante = MerchantContract::query()->where('merchant_account_id', $comerciante->id)->first(); $taxaDesconto = $valorAPagar * ($contractoComerciante->taxa) / 100; $valorMin = $contractoComerciante->valor_min; $valorMax = $contractoComerciante->valor_max; if ($taxaDesconto < $valorMin) { $taxaDesconto = $valorMin; } if ($taxaDesconto > $valorMax) { $taxaDesconto = $valorMax; } // $valorFinal = $valorAPagar - $valorAPagar*($contractoComerciante->taxa)/100; $valorFinal = $valorAPagar - $taxaDesconto; // Recever User Merchante DB::table('merchant_accounts')->where('account_number', $comerciante->account_number)->increment('balance', $valorFinal); // $profit = $valorAPagar*($contractoComerciante->taxa)/100; $transaction = $trasactionGeneration->generateTransaction(); $createTransaction = Payment::create([ 'transaction_id' => $transaction, 'sender_id' => $payer_id, 'merchant_account_id' => $comerciante->id, 'received_points' => $points, 'amount' => $valorAPagar, 'amount_credited' => $valorFinal, 'comissao' => $taxaDesconto, 'description' => $request->description, 'used_points' => $request->used_points, 'estado' => 'pago', 'estado_color' => '#388E3C', 'created_at' => now(), 'updated_at' => now() ]); $actualPoints = $imali->points + $points; $createTransaction->paymentHistoric()->create([ 'sender_account' => $imali->account_number, 'sender_name' => $payerUser->name, 'amount_credited' => $valorFinal, 'status_user' => 'sender', 'status' => 'done', 'comissao' => $taxaDesconto, 'amount' => $valorAPagar, 'user_id' => $payerUser->id, 'actual_points' => $actualPoints, 'last_points' => $imali->points, 'win_points' => $points, 'transaction_id' => $transaction ]); $saveProfit = $createTransaction->profit()->create([ 'payer_id' => $payer_id, 'payer_account' => $comerciante->account_number, 'amount' => $valorAPagar, 'amount_credited' => $valorFinal, 'comissao' => $taxaDesconto, 'profit_id' => $trasactionGeneration->generateTransaction(), 'payment_id' => $createTransaction->id, ]); if ($saveProfit) { $sms = new SendSMS(); $sms->sendMessageToClientePayment($createTransaction); $sms->sendMessageToComerciante($createTransaction); // $sms->sendMessageToClientePayment($payerUser); Mail::to($comerciante->email_loja)->send(new PagamentoConfirmado($createTransaction)); Mail::to($payerUser->email)->send(new Pagamento($createTransaction)); $log = new Record(); $log->createLog([ 'description' => $imali->account_number . ' ' . $comerciante->name, 'details' => 'Pagamento Feito com Sucesso', 'operation' => 'Payment', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'status' => 'Success', 'user_id' => $request->user()->id ]); return response()->json([ 'message' => 'Pagamento Feito com Sucesso!', 'transaction' => $transaction, 'created_at' => $createTransaction->created_at, 'duration' => 3000 ], 200); } } } } } public function makePaymentStoreNEW(Request $request) { DB::transaction(function ($request) { $user = User::find($request->user()->id); // $user = DB::table('users')-> if (Hash::check($request->pin, $user->pin)) { $trasactionGeneration = new TransactionGeneration(); $payerUser = User::query()->where('user_id', $request->user()->user_id)->first(); $store = Store::query()->where('account_number', $request->account_number)->first(); $payer_id = $payerUser->id; $imali = ImaliAccount::query()->where('user_id', $payer_id)->first(); $kyc = new Kyc(); $kycCheck = $kyc->checkSenderPayment($request); if ($kycCheck) { $log = new Record(); $log->createLog([ 'description' => $imali->account_number . ' ' . $store->name, 'details' => $kycCheck, 'operation' => 'Payment', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'status' => 'Error', 'user_id' => $request->user()->id ]); return $kycCheck; } else { if ($payerUser) { if ($imali->balance < $request->amount) { $log = new Record(); $log->createLog([ 'description' => $imali->account_number . ' ' . $store->name, 'details' => 'Saldo Insuficiente', 'operation' => 'Payment', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'status' => 'Error', 'user_id' => $request->user()->id ]); return response()->json(['message' => 'Saldo insuficiente', 'class' => 'error'], 402, [], JSON_NUMERIC_CHECK); } else { $valorAPagar = $request->amount; $points = round($valorAPagar); // Payer or Sender Section DB::table('imali_accounts')->where('user_id', $payer_id)->decrement('balance', $valorAPagar); DB::table('imali_accounts')->where('user_id', $payer_id)->increment('points', $points); $contractoComerciante = MerchantContract::query()->where('store_id', $store->id)->first(); $taxaDesconto = $valorAPagar * ($contractoComerciante->taxa) / 100; $valorMin = $contractoComerciante->min_amount; $valorMax = $contractoComerciante->max_amount; if ($taxaDesconto < $valorMin) { $taxaDesconto = $valorMin; } if ($taxaDesconto > $valorMax) { $taxaDesconto = $valorMax; } // $valorFinal = $valorAPagar - $valorAPagar*($contractoComerciante->taxa)/100; $valorFinal = $valorAPagar - $taxaDesconto; // Recever User Merchante DB::table('stores')->where('account_number', $store->account_number)->increment('balance', $valorFinal); $storeT = Store::query()->where('account_number', $store->account_number)->first(); DB::table('merchant_accounts')->where('id', $storeT->merchant_account_id)->increment('balance', $valorFinal); // $profit = $valorAPagar*($contractoComerciante->taxa)/100; $transaction = $trasactionGeneration->generateTransaction(); $createTransaction = Payment::create([ 'transaction_id' => $transaction, 'sender_id' => $payer_id, 'store_id' => $store->id, 'client_id' => $request->user_client_id, 'received_points' => $points, 'amount' => $valorAPagar, 'amount_credited' => $valorFinal, 'comissao' => $taxaDesconto, 'description' => $request->description, 'used_points' => $request->used_points, 'estado' => 'pago', 'payment_type' => 'payment', 'estado_color' => '#388E3C', 'created_at' => now(), 'updated_at' => now(), 'category_id' => $store->industry_activity ]); // TransactionHistory::create([ // 'user_id' => $request->user()->id, // 'payment_id' => $createTransaction->id, // 'category_id' => $createTransaction->category_id, // 'transaction_type' => 'payment' // ]); $actualPoints = $imali->points + $points; $re = $createTransaction->paymentHistoric()->create([ 'sender_account' => $imali->account_number, 'sender_name' => $payerUser->name, 'amount_credited' => $valorFinal, 'status_user' => 'sender', 'status' => 'done', 'comissao' => $taxaDesconto, 'amount' => $valorAPagar, 'user_id' => $payerUser->id, 'actual_points' => $actualPoints, 'last_points' => $imali->points, 'win_points' => $points, 'transaction_id' => $transaction, 'category_id' => $store->industry_activity ]); $saveProfit = $createTransaction->profit()->create([ 'payer_id' => $payer_id, 'payer_account' => $store->account_number, 'amount' => $valorAPagar, 'amount_credited' => $valorFinal, 'comissao' => $taxaDesconto, 'profit_id' => $trasactionGeneration->generateTransaction(), 'payment_id' => $createTransaction->id, 'profit_payer_id' => $createTransaction->store_id ]); if ($saveProfit) { $this->smsManager->sendSMSToComerciante($createTransaction); // $sms = new SendSMS(); // $sms->sendMessageToClientePayment($createTransaction); // $sms->sendMessageToComerciante($createTransaction); // $sms->sendMessageToClientePayment($payerUser); // Mail::to($store->email)->send(new PagamentoConfirmado($createTransaction)); // Mail::to($payerUser->email)->send(new Pagamento($createTransaction)); $generate = StoreAmountGeneration::query() ->where('id', $request->store_amount_generation_id) ->first(); if ($generate) { $generate->update([ 'status' => 'sucesso' ]); } $log = new Record(); $log->createLog([ 'description' => $imali->account_number . ' ' . $store->name, 'details' => 'Pagamento Feito com Sucesso', 'operation' => 'Payment', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'status' => 'Success', 'user_id' => $request->user()->id ]); $notification = array( 'icon' => 'ic_imali_logo_verde_01', // 'icon' => 'ic_i_mali_cover', 'title' => 'Pagemento ' . $request->amount . ' MT', 'body' => 'Parabéns, ' . ' fez o pagamento de ' . $request->amount . ' MT ' . ' na loja ' . $store->name, 'click_action' => 'com.imali.payapp.payment_PAGAR_NOTIFICATION', // 'color' => '#008577' 'color' => '#ffffff' ); $data = array( 'transaction' => $createTransaction->transaction_id, 'loja' => $store->name, 'loja_account' => $store->account_number, 'pontos' => $createTransaction->received_points, 'pontos_usados' => $createTransaction->used_points, 'amount' => $createTransaction->amount, 'amount_debited' => $createTransaction->amount_credited, 'account_number' => $imali->account_number, 'phone' => $request->user()->phone, 'descricao' => $createTransaction->description, 'data' => $createTransaction->created_at, 'estado' => $createTransaction->estado, 'comissao' => $createTransaction->comissao, 'route' => 'PAGAR_NOTIFICATION', 'terminal' => 'firebase' ); $this->pushNotifification($user->firebase_token, $notification, $data); return response()->json([ 'message' => 'Pagamento Feito com Sucesso!', 'transaction' => $transaction, 'created_at' => $createTransaction->created_at, 'duration' => 3000 ], 200); } } } } } else { return response()->json(['message' => 'Pin Incorrecto'], 400); } }); } private function checkExpiredLink($push) { if ($push) { $expirationDate = (int)strtotime($push->expiration_datetime); $todayDate = (int)strtotime(date('Y-m-d H:i:s')); $remaningtime = $todayDate > $expirationDate; if ($remaningtime && ($push->status == 'PENDING')) { $push->status = 'EXPIRED'; $push->update(); } } } // PAGAMENTO PARA KRB -- 15 / 05 / 2024 // TODO -- 15-Setembro-2024 public function makePaymentStoreAppKRB2024(Request $request) { /** * adicionar variavel * @payment_type : PAYMENT_STORE -- para fazer pagamento na loja * @payment_type : PAYMENT_NFC_CARD -- para fazer pagamento na Escola Americana * @payment_type : PAYMENT_BNPL -- para fazer pagamento/deposito na KRB */ $this->validate($request, [ 'payer_account_number' => 'required|numeric', 'payment_type' => 'required|in:PAYMENT_STORE,PAYMENT_NFC_CARD,PAYMENT_QRCODE,PAYMENT_LINK,PAYMENT_PUSH', 'amount' => 'required|numeric|min:1', ], [ 'payer_account_number.required' => 'O numero da conta e obrigatorio', 'payer_account_number.numeric' => 'O numero da conta deve ser numerico', 'payment_type.required' => 'O tipo de pagamento e obrigatorio', 'payment_type.in' => 'O tipo de pagamento deve ter um tipo valido: PAYMENT_STORE, PAYMENT_NFC_CARD,PAYMENT_QRCODE,PAYMENT_LINK,PAYMENT_PUSH', 'amount.required' => 'O montante e obrigatorio', 'amount.numeric' => 'O montante deve ser numerico', 'amount.min' => 'O montante tem que ser maior que zero (0)', ]); $generated_payment = Payment::query()->where('transaction_id', $request->transaction)->first(); if ($generated_payment && $generated_payment->status === 'success') return SendResponse::errorResp400('Este pagamento já foi efetuado.', 'This payment has already been paid.'); // LINHA A SER ANALISADA.. if ($generated_payment && $generated_payment->status === 'expired') return SendResponse::errorResp400('Este pagamento está expirado.', 'This payment is expided'); // LINHA A SER ANALISADA.. if ($generated_payment && $generated_payment->status === 'rejected') return SendResponse::errorResp400('Este pagamento foi rejeitado.', 'This payment was rejected.'); // LINHA A SER ANALISADA.. // $generated_push_payment = PushPaymentRequest::query()->where('push_id', $request->transaction)->first(); $generated_push_payment = PaymentRequest::query()->where('transaction_id', $request->transaction)->first(); Log::info('TRANSACAO DE RETORNO', ['TRANSACAO DE RETORNO' => $generated_push_payment]); $generated_qrcode_payment = AppQrcode::query()->where('qrcode_id', $request->transaction)->first(); // Buscar a loja onde se fara o pagamento $store_account = Store::getStoreAccount($generated_push_payment->store_account_number ?? $request->store_account_number); if (!$store_account) return SendResponse::errorResp404notfound( 'Conta da loja não encontrada', 'StoreAccount Not Found', ); $store_account_old = Store::getStoreAccount($generated_push_payment->store_account_number ?? $request->store_account_number); $store_contract = Store::getStoreContractsAndConfigs($store_account->account_number); $business = BusinessAccount::getBusinessAccountByID($store_account->business_account_id); if (!$business) return SendResponse::errorResp404notfound( 'Conta da loja não associada a conta Empresa', 'Store account not associated with Company account', ); // todo ----- PUSH if ($generated_push_payment && ($generated_push_payment->payment_methods_id != 1)) { Log::info('ENTROU NO GENERATED PUSH ✅🌿', ['ENTROU NO GENERATED PUSH ✅🌿' => $generated_push_payment]); $this->checkExpiredLink($generated_push_payment); if ($generated_push_payment->status === 'SUCCESS') return SendResponse::errorResp400('Este push já foi pago.', 'This push has already been paid.'); // LINHA A SER ANALISADA.. if ($generated_push_payment->status === 'EXPIRED') return SendResponse::errorResp400('Este push está expirado.', 'This push is expided'); // LINHA A SER ANALISADA.. if ($generated_push_payment->status === 'REJECTED') return SendResponse::errorResp400('Este push foi rejeitado.', 'This push was rejected.'); // LINHA A SER ANALISADA.. if ($generated_push_payment->status === 'FAILED') return SendResponse::errorResp400('Este push falhou', 'This Push failed'); // LINHA A SER ANALISADA.. try { //code... DB::beginTransaction(); // retirar o valor a pagar do saldo do User que esta a pagar // $accountPayer->balance -= $request->amount; // $accountPayer->update(); // Calculos para efectuar pagamento $imali_commission = $request->amount * ($store_contract->taxa) / 100; $points = round($request->amount); $store_account->balance += ($request->amount - $imali_commission); $store_account->update(); // adicionar o valor retirado na conta do accountPayer no balance da Loja $business->balance += ($request->amount - $imali_commission); $business->update(); $created_payment = $this->create_payment_store_wallets_transaction($request, $store_account, $store_account_old, $business, $imali_commission, $points, $generated_push_payment); DB::commit(); Log::info('Outgoing response', [ 'content' => [ 'message' => trans('payment_done'), 'transaction' => $created_payment->transaction_id, 'created_at' => $created_payment->created_at ], ]); } catch (\Throwable $th) { DB::rollBack(); Log::info('Error response', [ 'content' => [ 'message' => 'Falha no pagamento', 'data' => $th->getMessage(), ], ]); // Escrever no ficheiro de log as mensagens de erro. return response()->json(['message' => 'Falha no pagamento', $th->getMessage(), $th->getLine()], 500); //throw $th; } return response()->json([ 'message' => trans('payment_done'), 'transaction' => $created_payment->transaction_id, 'created_at' => $created_payment->created_at ]); } // todo ----- PUSH // todo rever PUSH IMALI.... // Validar o PIN e Fingerprint do userPayer $auth = new ClassesAuth(); $authResp = $auth->checkUserPinAndFingerprint($request); if ($authResp->getStatusCode() != 200) return $authResp; // Contas a Pagar $accountPayer = User::getAccount($request->payer_account_number); if (!$accountPayer) return SendResponse::errorResp404notfound( 'Conta não encontrada', 'Account Not Found', ); $accountPayerOld = User::getAccount($request->payer_account_number); $userPayer = User::getUserDetails($accountPayer->user_id); // ---------------------------------------------------- if (User::is_subAccount($request->payer_account_number)) $userPayer = User::getUserDetails($accountPayer->user_id, $accountPayer->account_id); // ---------------------------------------------------- // Validar KYC do userPayer $kyc = new UserKyc($userPayer); $kycResp = $kyc->checkSenderKYC($request->amount); if ($kycResp->getStatusCode() != 200) return $kycResp; // Validacao do saldo do User $kycRespBalance = $kyc->checkUserBalance($request->amount); if ($kycRespBalance->getStatusCode() != 200) return $kycRespBalance; // todo ----- QRCODE if ($generated_qrcode_payment) { $this->checkExpiredLink($generated_qrcode_payment); if ($generated_qrcode_payment && $generated_qrcode_payment->status === 'USED') return SendResponse::errorResp400('Este QRcode já foi pago.', 'This QRcode has already been paid.'); // LINHA A SER ANALISADA.. if ($generated_qrcode_payment && $generated_qrcode_payment->status === 'EXPIRED') return SendResponse::errorResp400('Este QRcode está expirado.', 'This QRcode is expided'); // LINHA A SER ANALISADA.. if ($generated_qrcode_payment && $generated_qrcode_payment->status === 'INACTIVE') return SendResponse::errorResp400('Este QRcode está inactivo.', 'This QRcode is inactive.'); // LINHA A SER ANALISADA.. try { //code... DB::beginTransaction(); // retirar o valor a pagar do saldo do User que esta a pagar // $accountPayer->balance -= $request->amount; // $accountPayer->update(); // Calculos para efectuar pagamento $imali_commission = $request->amount * ($store_contract->taxa) / 100; $points = round($request->amount); $store_account->balance += ($request->amount - $imali_commission); $store_account->update(); // adicionar o valor retirado na conta do accountPayer no balance da Loja $business->balance += ($request->amount - $imali_commission); $business->update(); $created_payment = $this->create_payment_store_qrcode_transaction($request, $store_account, $store_account_old, $business, $imali_commission, $points, $generated_qrcode_payment, $accountPayer); DB::commit(); Log::info('Outgoing response', [ 'content' => [ 'message' => trans('payment_done'), 'transaction' => $created_payment->transaction_id, 'created_at' => $created_payment->created_at ], ]); } catch (\Throwable $th) { DB::rollBack(); Log::info('Error response', [ 'content' => [ 'message' => 'Falha no pagamento', 'data' => $th->getMessage(), ], ]); // Escrever no ficheiro de log as mensagens de erro. return response()->json(['message' => 'Falha no pagamento', $th->getMessage(), $th->getLine()], 500); //throw $th; } return response()->json([ 'message' => trans('payment_done'), 'transaction' => $created_payment->transaction_id, 'created_at' => $created_payment->created_at ]); } // todo ----- QRCODE if ($generated_push_payment && ($generated_push_payment->payment_methods_id == 1)) { Log::info('ENTROU NO GENERATED PUSH ✅🌿', ['ENTROU NO GENERATED PUSH ✅🌿' => $generated_push_payment]); $this->checkExpiredLink($generated_push_payment); if ($generated_push_payment->status === 'SUCCESS') return SendResponse::errorResp400('Este push já foi pago.', 'This push has already been paid.'); // LINHA A SER ANALISADA.. if ($generated_push_payment->status === 'EXPIRED') return SendResponse::errorResp400('Este push está expirado.', 'This push is expided'); // LINHA A SER ANALISADA.. if ($generated_push_payment->status === 'REJECTED') return SendResponse::errorResp400('Este push foi rejeitado.', 'This push was rejected.'); // LINHA A SER ANALISADA.. if ($generated_push_payment->status === 'FAILED') return SendResponse::errorResp400('Este push falhou', 'This Push failed'); // LINHA A SER ANALISADA.. try { //code... DB::beginTransaction(); // retirar o valor a pagar do saldo do User que esta a pagar $accountPayer->balance -= $request->amount; $accountPayer->update(); // Calculos para efectuar pagamento $imali_commission = $request->amount * ($store_contract->taxa) / 100; $points = round($request->amount); $store_account->balance += ($request->amount - $imali_commission); $store_account->update(); // adicionar o valor retirado na conta do accountPayer no balance da Loja $business->balance += ($request->amount - $imali_commission); $business->update(); $created_payment = $this->create_payment_store_wallets_transaction($request, $store_account, $store_account_old, $business, $imali_commission, $points, $generated_push_payment, $userPayer, $accountPayer, $accountPayerOld); DB::commit(); Log::info('Outgoing response', [ 'content' => [ 'message' => trans('payment_done'), 'transaction' => $created_payment->transaction_id, 'created_at' => $created_payment->created_at ], ]); } catch (\Throwable $th) { DB::rollBack(); Log::info('Error response', [ 'content' => [ 'message' => 'Falha no pagamento', 'data' => $th->getMessage(), ], ]); // Escrever no ficheiro de log as mensagens de erro. return response()->json(['message' => 'Falha no pagamento', $th->getMessage(), $th->getLine()], 500); //throw $th; } return response()->json([ 'message' => trans('payment_done'), 'transaction' => $created_payment->transaction_id, 'created_at' => $created_payment->created_at ]); } // todo rever PUSH IMALI.... switch ($request->payment_type) { case 'PAYMENT_STORE': return $this->makePaymentToStore($request, $generated_payment, $userPayer, $accountPayer, $accountPayerOld, $generated_push_payment); break; case 'PAYMENT_NFC_CARD': return $this->makeCardPayment($request, $generated_payment, $userPayer, $accountPayer, $accountPayerOld); break; default: return SendResponse::errorResp400( 'O tipo de pagamento deve ter um tipo valido: PAYMENT_STORE, PAYMENT_NFC_CARD', 'The payment type must have a valid type: PAYMENT_STORE, PAYMENT_NFC_CARD' ); break; } } public function makePaymentStoreAppKRB2024OLD2025May(Request $request) { /** * adicionar variavel * @payment_type : PAYMENT_STORE -- para fazer pagamento na loja * @payment_type : PAYMENT_NFC_CARD -- para fazer pagamento na Escola Americana * @payment_type : PAYMENT_BNPL -- para fazer pagamento/deposito na KRB */ $this->validate($request, [ 'payer_account_number' => 'required|numeric', 'payment_type' => 'required|in:PAYMENT_STORE,PAYMENT_NFC_CARD,PAYMENT_QRCODE,PAYMENT_LINK,PAYMENT_PUSH', 'amount' => 'required|numeric|min:1', ], [ 'payer_account_number.required' => 'O numero da conta e obrigatorio', 'payer_account_number.numeric' => 'O numero da conta deve ser numerico', 'payment_type.required' => 'O tipo de pagamento e obrigatorio', 'payment_type.in' => 'O tipo de pagamento deve ter um tipo valido: PAYMENT_STORE, PAYMENT_NFC_CARD,PAYMENT_QRCODE,PAYMENT_LINK,PAYMENT_PUSH', 'amount.required' => 'O montante e obrigatorio', 'amount.numeric' => 'O montante deve ser numerico', 'amount.min' => 'O montante tem que ser maior que zero (0)', ]); $generated_payment = Payment::query()->where('transaction_id', $request->transaction)->first(); if ($generated_payment && $generated_payment->status === 'success') return SendResponse::errorResp400('Este pagamento já foi efetuado.', 'This payment has already been paid.'); // LINHA A SER ANALISADA.. if ($generated_payment && $generated_payment->status === 'expired') return SendResponse::errorResp400('Este pagamento está expirado.', 'This payment is expided'); // LINHA A SER ANALISADA.. if ($generated_payment && $generated_payment->status === 'rejected') return SendResponse::errorResp400('Este pagamento foi rejeitado.', 'This payment was rejected.'); // LINHA A SER ANALISADA.. // $generated_push_payment = PushPaymentRequest::query()->where('push_id', $request->transaction)->first(); $generated_push_payment = PaymentRequest::query()->where('transaction_id', $request->transaction)->first(); Log::info('TRANSACAO DE RETORNO', ['TRANSACAO DE RETORNO' => $generated_push_payment]); // if ($generated_push_payment && $generated_push_payment->status === 'SUCCESS') return SendResponse::errorResp400('Este pagamento push já foi efetuado.', 'This payment push has already been paid.'); // LINHA A SER ANALISADA.. // if ($generated_push_payment && $generated_push_payment->status === 'EXPIRED') return SendResponse::errorResp400('Este pagamento push está expirado.', 'This payment push is expided'); // LINHA A SER ANALISADA.. // if ($generated_push_payment && $generated_push_payment->status === 'REJECTED') return SendResponse::errorResp400('Este pagamento push foi rejeitado.', 'This payment push was rejected.'); // LINHA A SER ANALISADA.. // if ($generated_push_payment && $generated_push_payment->status === 'FAILED') return SendResponse::errorResp400('Este pagamento push falhou.', 'This payment push is failed.'); // LINHA A SER ANALISADA.. // todo --- 14/03/2025 -- QRCODE $generated_qrcode_payment = AppQrcode::query()->where('qrcode_id', $request->transaction)->first(); // todo --- 14/03/2025 -- QRCODE // $generated_link_payment = Link::query()->where('link_id', $request->transaction)->orWhere('customer_link_id', $request->transaction)->first(); // if ($generated_link_payment) { // $this->checkExpiredLink($generated_link_payment); // if ($generated_link_payment->status === 'USED') return SendResponse::errorResp400('Este link já foi usado.', 'This link has already been used.'); // LINHA A SER ANALISADA.. // if ($generated_link_payment->status === 'EXPIRED') return SendResponse::errorResp400('Este link está expirado.', 'This link is expired'); // LINHA A SER ANALISADA.. // if ($generated_link_payment->status === 'INACTIVE') return SendResponse::errorResp400('Este link esta inactivo.', 'This link is inactive.'); // LINHA A SER ANALISADA.. // } else // $check_payment = ($generated_payment && $generated_payment->status === 'rejected') || ($generated_payment && $generated_payment->status === 'expired') || ($generated_payment && $generated_payment->status === 'success'); // if ($check_payment) return SendResponse::errorResp402rejected( // 'Pagamento invalido', // 'Invalid Payment', // ); // Validar o PIN e Fingerprint do userPayer $auth = new ClassesAuth(); $authResp = $auth->checkUserPinAndFingerprint($request); if ($authResp->getStatusCode() != 200) return $authResp; // Contas a Pagar $accountPayer = User::getAccount($request->payer_account_number); if (!$accountPayer) return SendResponse::errorResp404notfound( 'Conta não encontrada', 'Account Not Found', ); // if ($accountPayer->account_number == $request->payer_account_number) return SendResponse::errorResp404notfound( $accountPayerOld = User::getAccount($request->payer_account_number); $userPayer = User::getUserDetails($accountPayer->user_id); // ---------------------------------------------------- if (User::is_subAccount($request->payer_account_number)) $userPayer = User::getUserDetails($accountPayer->user_id, $accountPayer->account_id); // ---------------------------------------------------- // Validar KYC do userPayer $kyc = new UserKyc($userPayer); $kycResp = $kyc->checkSenderKYC($request->amount); if ($kycResp->getStatusCode() != 200) return $kycResp; // Validacao do saldo do User $kycRespBalance = $kyc->checkUserBalance($request->amount); if ($kycRespBalance->getStatusCode() != 200) return $kycRespBalance; // todo ----- PUSH if ($generated_push_payment) { $this->checkExpiredLink($generated_push_payment); if ($generated_push_payment->status === 'SUCCESS') return SendResponse::errorResp400('Este push já foi pago.', 'This push has already been paid.'); // LINHA A SER ANALISADA.. if ($generated_push_payment->status === 'EXPIRED') return SendResponse::errorResp400('Este push está expirado.', 'This push is expided'); // LINHA A SER ANALISADA.. if ($generated_push_payment->status === 'REJECTED') return SendResponse::errorResp400('Este push foi rejeitado.', 'This push was rejected.'); // LINHA A SER ANALISADA.. if ($generated_push_payment->status === 'FAILED') return SendResponse::errorResp400('Este push falhou', 'This Push failed'); // LINHA A SER ANALISADA.. // Buscar a loja onde se fara o pagamento $store_account = Store::getStoreAccount($generated_push_payment->store_account_number); if (!$store_account) return SendResponse::errorResp404notfound( 'Conta da loja não encontrada', 'StoreAccount Not Found', ); $store_account_old = Store::getStoreAccount($generated_push_payment->store_account_number); $store_contract = Store::getStoreContractsAndConfigs($store_account->account_number); $business = BusinessAccount::getBusinessAccountByID($store_account->business_account_id); if (!$business) return SendResponse::errorResp404notfound( 'Conta da loja não associada a conta Empresa', 'Store account not associated with Company account', ); // if (!$business) return response()->json(['message' => 'Conta da loja não associada a conta Empresa']); try { //code... DB::beginTransaction(); // retirar o valor a pagar do saldo do User que esta a pagar $accountPayer->balance -= $request->amount; $accountPayer->update(); // Calculos para efectuar pagamento $imali_commission = $request->amount * ($store_contract->taxa) / 100; $points = round($request->amount); $store_account->balance += ($request->amount - $imali_commission); $store_account->update(); // adicionar o valor retirado na conta do accountPayer no balance da Loja $business->balance += ($request->amount - $imali_commission); $business->update(); $created_payment = $this->create_payment_store_wallets_transaction($request, $store_account, $store_account_old, $business, $imali_commission, $points, $generated_push_payment); DB::commit(); Log::info('Outgoing response', [ 'content' => [ 'message' => trans('payment_done'), 'transaction' => $created_payment->transaction_id, 'created_at' => $created_payment->created_at ], ]); } catch (\Throwable $th) { DB::rollBack(); Log::info('Error response', [ 'content' => [ 'message' => 'Falha no pagamento', 'data' => $th->getMessage(), ], ]); // Escrever no ficheiro de log as mensagens de erro. return response()->json(['message' => 'Falha no pagamento', $th->getMessage(), $th->getLine()], 500); //throw $th; } return response()->json([ 'message' => trans('payment_done'), 'transaction' => $created_payment->transaction_id, 'created_at' => $created_payment->created_at ]); } // todo ----- PUSH // todo ----- QRCODE if ($generated_qrcode_payment) { $this->checkExpiredLink($generated_qrcode_payment); if ($generated_qrcode_payment && $generated_qrcode_payment->status === 'USED') return SendResponse::errorResp400('Este QRcode já foi pago.', 'This QRcode has already been paid.'); // LINHA A SER ANALISADA.. if ($generated_qrcode_payment && $generated_qrcode_payment->status === 'EXPIRED') return SendResponse::errorResp400('Este QRcode está expirado.', 'This QRcode is expided'); // LINHA A SER ANALISADA.. if ($generated_qrcode_payment && $generated_qrcode_payment->status === 'INACTIVE') return SendResponse::errorResp400('Este QRcode está inactivo.', 'This QRcode is inactive.'); // LINHA A SER ANALISADA.. // Buscar a loja onde se fara o pagamento $store_account = Store::getStoreAccount($generated_qrcode_payment->store_account_number); if (!$store_account) return SendResponse::errorResp404notfound( 'Conta da loja não encontrada', 'StoreAccount Not Found', ); $store_account_old = Store::getStoreAccount($generated_qrcode_payment->store_account_number); $store_contract = Store::getStoreContractsAndConfigs($store_account->account_number); $business = BusinessAccount::getBusinessAccountByID($store_account->business_account_id); if (!$business) return SendResponse::errorResp404notfound( 'Conta da loja não associada a conta Empresa', 'Store account not associated with Company account', ); // if (!$business) return response()->json(['message' => 'Conta da loja não associada a conta Empresa']); try { //code... DB::beginTransaction(); // retirar o valor a pagar do saldo do User que esta a pagar $accountPayer->balance -= $request->amount; $accountPayer->update(); // Calculos para efectuar pagamento $imali_commission = $request->amount * ($store_contract->taxa) / 100; $points = round($request->amount); $store_account->balance += ($request->amount - $imali_commission); $store_account->update(); // adicionar o valor retirado na conta do accountPayer no balance da Loja $business->balance += ($request->amount - $imali_commission); $business->update(); $created_payment = $this->create_payment_store_qrcode_transaction($request, $store_account, $store_account_old, $business, $imali_commission, $points, $generated_qrcode_payment, $accountPayer); DB::commit(); Log::info('Outgoing response', [ 'content' => [ 'message' => trans('payment_done'), 'transaction' => $created_payment->transaction_id, 'created_at' => $created_payment->created_at ], ]); } catch (\Throwable $th) { DB::rollBack(); Log::info('Error response', [ 'content' => [ 'message' => 'Falha no pagamento', 'data' => $th->getMessage(), ], ]); // Escrever no ficheiro de log as mensagens de erro. return response()->json(['message' => 'Falha no pagamento', $th->getMessage(), $th->getLine()], 500); //throw $th; } return response()->json([ 'message' => trans('payment_done'), 'transaction' => $created_payment->transaction_id, 'created_at' => $created_payment->created_at ]); } // todo ----- QRCODE switch ($request->payment_type) { case 'PAYMENT_STORE': return $this->makePaymentToStore($request, $generated_payment, $userPayer, $accountPayer, $accountPayerOld, $generated_push_payment); break; case 'PAYMENT_NFC_CARD': return $this->makeCardPayment($request, $generated_payment, $userPayer, $accountPayer, $accountPayerOld); break; default: return SendResponse::errorResp400( 'O tipo de pagamento deve ter um tipo valido: PAYMENT_STORE, PAYMENT_NFC_CARD', 'The payment type must have a valid type: PAYMENT_STORE, PAYMENT_NFC_CARD' ); break; } } // TODO -- 15-Setembro-2024 public function payment_guard(Request $request) { Log::info('LOG DO GUARD', ['DADOS' => $request->all()]); if (!($request->has('payment_type') && $request->payment_type)) { //! NOVO 02-08-2024 - Por remover $user = User::getUserAccount(); if (!$user) { $new_request = new Request([ 'store_account_number' => $request->store_account_number, 'payer_account_number' => $request->payer_account_number, 'payment_type' => 'PAYMENT_STORE', 'amount' => $request->amount ]); return $this->makePaymentStoreWallets($new_request); } $payer_account_number = ($request->has('payer_account_number') && $request->payer_account_number) ? $request->payer_account_number : $user->account_number; $payment_type = ($request->has('sub_account_number') && $request->sub_account_number) ? 'PAYMENT_NFC_CARD' : 'PAYMENT_STORE'; $request->request->add([ 'sub_account_number' => $request->sub_account_number, 'store_account_number' => $request->account_number, 'payer_account_number' => $payer_account_number, 'payment_type' => $payment_type, ]); Log::info('LOG DO dados II', ['DADOS' => $request->all()]); return $this->makePaymentStoreAppKRB2024($request); } return $this->makePaymentStoreAppKRB2024($request); } //--------------------------------------------- rodrigues ----------------------------------------------------------- public function payment_guard_new25(Request $request) { if (!($request->has('payment_type') && $request->payment_type)) { //! NOVO 02-08-2024 - Por remover $user = User::getUserAccount(); if (!$user) { $new_request = new Request([ 'store_account_number' => $request->store_account_number, 'payer_account_number' => $request->payer_account_number, 'payment_type' => 'PAYMENT_STORE', 'amount' => $request->amount ]); return $this->makePaymentStoreWallets($new_request); } $payer_account_number = ($request->has('payer_account_number') && $request->payer_account_number) ? $request->payer_account_number : $user->account_number; $payment_type = ($request->has('sub_account_number') && $request->sub_account_number) ? 'PAYMENT_NFC_CARD' : 'PAYMENT_STORE'; $request->request->add([ 'sub_account_number' => $request->sub_account_number, 'store_account_number' => $request->account_number, 'payer_account_number' => $payer_account_number, 'payment_type' => $payment_type, ]); return $this->makePaymentStoreAppKRB2024($request); } return $this->makePaymentStoreAppKRB2024($request); } /** * adicionar variavel * @payment_type : DIRECT -- para fazer pagamento na loja * @payment_type : NFC_CARD -- para fazer pagamento na Escola Americana * @payment_type : BNPL -- para fazer pagamento/deposito na KRB * @payment_type : PUSH -- para fazer pagamentos por push * @payment_type : QRCODE -- para fazer pagamento por qrcode * @payment_type : LINK -- para fazer pagamento por link */ public function make_payment_to_store_many_forms_new25(Request $request, $store, $store_old, $store_account) { $this->validate($request, [ 'store_account_number' => 'required|numeric|exists:stores,account_number', 'payment_type' => 'required|in:DIRECT,QRCODE,LINK,PUSH,NFC_CARD,BNPL|exists:payment_types,name', 'payment_method' => 'required|in:IMALI,MPESA,EMOLA,MKESH|exists:payment_methods,name', 'amount' => 'required|numeric|min:0.50|regex:/^\d+(\.\d{1,2})?$/', 'sub_account_number' => 'required_if:payment_type,NFC_CARD|numeric', 'qrcode_token' => 'required_if:payment_type,QRCODE|size:112', 'payer_account_number' => 'required|string', ], [ 'payer_account_number.required' => 'O numero da conta e obrigatorio', 'payer_account_number.numeric' => 'O numero da conta deve ser numerico', 'payment_type.required' => 'O tipo de pagamento e obrigatorio', 'payment_type.in' => 'O tipo de pagamento deve ter um tipo valido: DIRECT,QRCODE,LINK,PUSH,NFC_CARD,BNPL', 'amount.required' => 'O montante e obrigatorio', 'amount.numeric' => 'O montante deve ser numerico', 'amount.min' => 'O montante tem que ser maior que zero (0.50)', 'amount.regex' => 'O montante tem que ter duas casas decimais' ]); // Buscar a loja onde se fara o pagamento if (!$store_account) return SendResponse::errorResp404notfound( 'Conta da loja não encontrada', 'StoreAccount Not Found', ); $store_account_old = Store::getStoreAccount($request->store_account_number); $store_contract = Store::getStoreContractsAndConfigs($store_account->account_number); $business = BusinessAccount::getBusinessAccountByID($store_account->business_account_id); if (!$business) return SendResponse::errorResp404notfound( 'Conta da loja não associada a conta Empresa', 'Store account not associated with Company account', ); //validar KYC da Loja $storeKyc = new StoreKyc($store_contract); $respStoreKyc = $storeKyc->checkStoreKYC($request->amount); if ($respStoreKyc->getStatusCode() != 200) return $respStoreKyc; switch ($request->payment_type) { case 'DIRECT': return $this->make_direct_payment_to_store_new25($request, $store, $store_old, $business); break; case 'PUSH': return $this->make_push_payment_to_store_new25($request, $store, $store_old, $business); break; case 'QRCODE': return $this->make_payment_qrcode_to_store_new25($request, $store, $store_old, $business); break; case 'LINK': return $this->make_payment_link_to_store_new25($request, $store, $store_old, $business); break; case 'BNPL': return $this->make_payment_bnpl_to_store_new25($request, $store, $store_old, $business); break; case 'NFC_CARD': return $this->make_payment_card_to_store_new25($request, $store, $store_old, $business); break; default: return SendResponse::errorResp400( 'O tipo de pagamento deve ter um tipo valido: DIRECT,QRCODE,LINK,PUSH,NFC_CARD,BNPL', 'The payment type must have a valid type: DIRECT,QRCODE,LINK,PUSH,NFC_CARD,BNPL' ); break; } } private function make_push_payment_to_store_new25($request, $store, $store_old, $business) {} // -----------------------------------------------fim rodrigues----------------------------------------------------------------------- // TODO -- 15-Setembro-2024 private function makePaymentToStore(Request $request, $generated_payment, $userPayer, $accountPayer, $accountPayerOld, $generated_push_payment) { $this->validate($request, [ 'store_account_number' => 'required|numeric', ], [ 'store_account_number.required' => 'O numero da loja e obrigatorio', 'store_account_number.numeric' => 'O numero da loja deve ser numerico', ]); // Buscar a loja onde se fara o pagamento $store_account = Store::getStoreAccount($request->store_account_number); if (!$store_account) return SendResponse::errorResp404notfound( 'Conta da loja não encontrada', 'StoreAccount Not Found', ); $store_account_old = Store::getStoreAccount($request->store_account_number); $store_contract = Store::getStoreContractsAndConfigs($store_account->account_number); $business = BusinessAccount::getBusinessAccountByID($store_account->business_account_id); if (!$business) return SendResponse::errorResp404notfound( 'Conta da loja não associada a conta Empresa', 'Store account not associated with Company account', ); if (!$business) return response()->json(['message' => 'Conta da loja não associada a conta Empresa']); // Se o id da conta (Empresa) que esta a fazer pagamento for o mesmo id (business_account_id) associado a conta da Loja entao... // if ($accountPayer->id == $store_account->business_account_id) return SendResponse::errorResp404notfound( if ($accountPayer->account_number == $business->account_number) return SendResponse::errorResp404notfound( 'Não está permitido a fazer pagamentos nesta loja', 'You are not allowed to make payments in this store', ); if (User::is_subAccount($request->payer_account_number)) { $subC_type = SubAccountType::query()->where('id', $accountPayer->sub_account_types_id)->first(); // if ((!$subC_type->can_pay) || ($subC_type->type_id != 'BNPL')) return SendResponse::errorResp400( if (!$subC_type->can_pay) return SendResponse::errorResp400( 'A conta seleciona nao pode efectuar pagamentos', 'The selected account can not make payments' ); $user_client = UserClient::query()->where('id', $store_account->user_client_id)->where('user_type', 'KRB')->first(); if (!$user_client) return SendResponse::errorResp400( 'Loja não permite pagamento de contas de empréstimo', 'Store does not allow payment of lending accounts' ); } //validar KYC da Loja $storeKyc = new StoreKyc($store_contract); $respStoreKyc = $storeKyc->checkStoreKYC($request->amount); if ($respStoreKyc->getStatusCode() != 200) return $respStoreKyc; // Calculos para efectuar pagamento $imali_commission = $request->amount * ($store_contract->taxa) / 100; $points = round($request->amount); // Efectuar o Pagamento.. try { DB::beginTransaction(); // retirar o valor a pagar do saldo do User que esta a pagar $accountPayer->balance -= $request->amount; $accountPayer->update(); // adicionar o valor retirado na conta do accountPayer no balance da Loja // $store_account->balance += ($request->amount - $imali_commission); // $store_account->update(); $store_account->balance += ($request->amount - $imali_commission); $store_account->update(); // adicionar o valor retirado na conta do accountPayer no balance da Loja $business->balance += ($request->amount - $imali_commission); $business->update(); // Criar pagamento $created_payment = $this->create_payment_store_transaction($generated_payment, $request, $userPayer, $accountPayer, $accountPayerOld, $store_account, $store_account_old, $imali_commission, $points, null, null, $generated_push_payment); // criar dependencias de pagamentos $this->create_payment_dependences($userPayer, $created_payment, $accountPayer, $request, $imali_commission, $points); // envio de notificacoes $this->send_payment_notifications($request, $store_contract, $userPayer, $accountPayer, $created_payment); DB::commit(); Log::info('Outgoing response', [ 'content' => [ 'message' => trans('payment_done'), 'transaction' => $created_payment->transaction_id, 'created_at' => $created_payment->created_at ], ]); return response()->json([ 'message' => trans('payment_done'), 'transaction' => $created_payment->transaction_id, 'created_at' => $created_payment->created_at ]); } catch (\Throwable $th) { DB::rollBack(); Log::info('Error response', [ 'content' => [ 'message' => 'Falha no pagamento', 'data' => $th->getMessage(), ], ]); // Escrever no ficheiro de log as mensagens de erro. return response()->json(['message' => 'Falha no pagamento', $th->getMessage(), $th->getLine()], 500); } } // TODO -- 15-Setembro-2024 private function makeCardPayment(Request $request, $generated_payment, $userPayer, $accountPayer, $accountPayerOld) { $this->validate($request, [ 'sub_account_number' => 'required|numeric', ], [ 'sub_account_number.required' => 'O numero da subconta e obrigatorio', 'sub_account_number.numeric' => 'O numero da subconta deve ser numerico', ]); if (User::is_subAccount($request->payer_account_number)) return SendResponse::errorResp400( 'A conta seleciona nao pode efectuar pagamentos', 'The selected account can not make payments' ); if ($userPayer->profile != 'client') return SendResponse::errorResp400( 'Esta conta nao pode fazer depositos em cartoes NFC', 'The selected account can not make deposit in NFC cards', ); $sub_account = User::getAccount($request->sub_account_number); if (!$sub_account) return SendResponse::errorResp404notfound( 'Conta não encontrada', 'Account Not Found', ); $sub_account_old = User::getAccount($request->sub_account_number); $subC_type = SubAccountType::query()->where('id', $sub_account->sub_account_types_id)->where('type_id', 'NFC_CARD')->first(); if (!$subC_type) return SendResponse::errorResp400( 'A tua subconta deve ser do tipo Cartao', 'Your subaccount must be of the Card type' ); $user_sub_account = User::getSubAccountByUser($userPayer->id, $sub_account->id); if (!$user_sub_account) return SendResponse::errorResp400( 'Conta de origem invalida', 'Invalid Source Account' ); $st = Store::query()->where('id', $sub_account->store_id)->first(); if (!$st) return SendResponse::errorResp404notfound( 'Conta não associada a uma loja', 'Account not associated with a store', ); // todo --- verificar se a loja é da Escola Americana::. if ($st->id == 135) return SendResponse::errorResp404notfound( 'Depósitos temporariamente indisponíveis', 'Deposits temporarily unavailable', ); // todo --- verificar se a loja é da Escola Americana::. $store_account = Store::getStoreAccount($st->account_number); if (!$store_account) return SendResponse::errorResp404notfound( 'Conta da loja não encontrada', 'StoreAccount Not Found', ); $business = BusinessAccount::getBusinessAccountByID($store_account->business_account_id); if (!$business) return SendResponse::errorResp404notfound( 'Conta da loja não associada a conta Empresa', 'Store account not associated with Company account', ); if ($sub_account->store_id != $store_account->id) return SendResponse::errorResp400( 'Numero de Comerciante/Loja invalido', 'Invalid Merchant/Store number' ); // Loja da subconta $store_account_old = Store::getStoreAccount($st->account_number); $store_contract = Store::getStoreContractsAndConfigs($st->account_number); //validar KYC da Loja $storeKyc = new StoreKyc($store_contract); $respStoreKyc = $storeKyc->checkStoreKYC($request->amount); if ($respStoreKyc->getStatusCode() != 200) return $respStoreKyc; // Calculos para efectuar pagamento $imali_commission = $request->amount * ($store_contract->taxa) / 100; $points = round($request->amount); // Efectuar o Pagamento.. try { DB::beginTransaction(); // retirar o valor a pagar do saldo do User que esta a pagar $accountPayer->balance -= $request->amount; $accountPayer->update(); // adicionar o valor retirado na conta do accountPayer no balance da Loja $store_account->balance += ($request->amount - $imali_commission); $store_account->update(); // adicionar o valor no Saldo da Conta Empresa $business->balance += ($request->amount - $imali_commission); $business->update(); // DEPOSITAR NA SUBCONTA $sub_account->balance += $request->amount; $sub_account->update(); // Criar pagamento $created_payment = $this->create_payment_nfc_card_transaction($generated_payment, $request, $userPayer, $accountPayer, $accountPayerOld, $store_account, $store_account_old, $imali_commission, $points, $sub_account, $sub_account_old); // criar dependencias de pagamentos $this->create_payment_dependences($userPayer, $created_payment, $accountPayer, $request, $imali_commission, $points); // envio de notificacoes $this->send_payment_notifications($request, $store_contract, $userPayer, $accountPayer, $created_payment); DB::commit(); return response()->json([ 'message' => trans('payment_done'), 'transaction' => $created_payment->transaction_id, 'created_at' => $created_payment->created_at ]); } catch (\Throwable $th) { DB::rollBack(); // Escrever no ficheiro de log as mensagens de erro. return response()->json(['message' => 'Falha no pagamento', $th->getMessage(), $th->getLine()], 500); } } // TODO -- 15-Setembro-2024 private function create_payment_nfc_card_transaction($generated_payment, $request, $userPayer, $accountPayer, $accountPayerOld, $store_account, $store_account_old, $imali_commission, $points, $sub_account = null, $sub_account_old = null) { $created_payment = new Payment(); // Registar o pagamento na tabela de Payment if ($generated_payment) { $generated_payment->update([ 'received_points' => $points, 'amount_credited' => $request->amount, 'comissao' => $imali_commission, 'description' => $request->description, 'used_points' => $request->used_points, 'estado' => 'success', 'status' => 'success', 'estado_color' => '#388E3C', 'sender_id' => $userPayer->id, 'old_balance' => $accountPayerOld->balance, 'new_balance' => $accountPayer->balance ]); $created_payment = $generated_payment; } else { $new_payment = Payment::create([ 'transaction_id' => $this->trasactionGeneration->generateTransaction(), 'partner_transaction_id' => $request->partner_transaction_id, 'terminalID' => $request->terminal_id, 'sender_id' => $userPayer->id, 'sender_name' => $userPayer->name, 'sender_account_number' => $accountPayer->account_number, 'sender_card_number' => $accountPayer->card_number, 'store_id' => $store_account->id, 'received_points' => $points, 'amount' => $request->amount, 'amount_debited' => $request->amount, 'amount_credited' => $request->amount - $imali_commission, 'comissao' => $imali_commission, 'description' => $request->description, 'used_points' => $request->used_points, 'estado' => 'success', 'status' => 'success', 'payment_type' => 'directo', 'estado_color' => '#388E3C', 'old_balance' => $accountPayerOld->balance, 'new_balance' => $accountPayer->balance, 'old_store_balance' => $store_account_old->balance, 'new_store_balance' => $store_account->balance, 'category_id' => $store_account->industry_activity, 'transaction_type' => 'debit', 'transaction_name' => 'Pagamento' ]); Payment::create([ 'transaction_id' => $this->trasactionGeneration->generateTransaction(), 'partner_transaction_id' => $request->partner_transaction_id, 'terminalID' => $request->terminal_id, 'sender_id' => $userPayer->id, 'sender_name' => $userPayer->name, 'sender_account_number' => $accountPayer->account_number, 'sender_card_number' => $sub_account ? $sub_account->card_number : null, 'store_id' => $store_account->id, 'received_points' => $points, 'amount' => $request->amount, 'amount_debited' => $request->amount, 'amount_credited' => $request->amount - $imali_commission, 'comissao' => $imali_commission, 'description' => $request->description, 'is_real_payment' => 0, 'used_points' => $request->used_points, 'estado' => 'success', 'status' => 'success', 'payment_type' => 'directo', 'estado_color' => '#388E3C', 'old_balance' => $accountPayerOld->balance, 'new_balance' => $accountPayer->balance, 'old_store_balance' => $store_account_old->balance, 'new_store_balance' => $store_account->balance, 'category_id' => $store_account->industry_activity, 'transaction_type' => 'credit', 'transaction_name' => 'Depósito', ]); PrepaidCardDeposit::create([ 'transaction_id' => $this->trasactionGeneration->generateTransaction(), 'payment_transaction_id' => $new_payment->transaction_id, 'imali_account_number' => $accountPayer->account_number, 'imali_sub_account_number' => $sub_account->account_number, 'store_account_number' => $store_account->account_number, 'imali_account_id' => $accountPayer->id, 'imali_sub_account_id' => $sub_account->id, 'store_id' => $store_account->id, 'last_unreal_balance' => $sub_account_old->balance, 'unreal_balance' => $sub_account->balance, 'unreal_amount_credited' => $request->amount, 'real_amount_debited' => $request->amount, 'real_amount_credited' => $request->amount - $imali_commission ]); $created_payment = $new_payment; } return $created_payment; } // TODO -- 15-Setembro-2024 public function makePaymentStoreWallets(Request $request) { $this->validate($request, [ 'payer_account_number' => 'required|numeric', 'payment_type' => 'required|in:PAYMENT_STORE,PAYMENT_NFC_CARD', 'amount' => 'required|numeric|min:1', ], [ 'payer_account_number.required' => 'O numero da conta e obrigatorio', 'payer_account_number.numeric' => 'O numero da conta deve ser numerico', 'payment_type.required' => 'O tipo de pagamento e obrigatorio', 'payment_type.in' => 'O tipo de pagamento deve ter um tipo valido: PAYMENT_STORE, PAYMENT_NFC_CARD', 'amount.required' => 'O montante e obrigatorio', 'amount.numeric' => 'O montante deve ser numerico', 'amount.min' => 'O montante tem que ser maior que zero (0)', ]); $generated_payment = Payment::query()->where('transaction_id', $request->transaction)->first(); $check_payment = ($generated_payment && $generated_payment->status === 'rejected') || ($generated_payment && $generated_payment->status === 'expired') || ($generated_payment && $generated_payment->status === 'success'); if ($check_payment) return SendResponse::errorResp402rejected( 'Pagamento invalido', 'Invalid Payment', ); return $this->makePaymentToStoreWallets($request, $generated_payment, null, null, null); } // TODO -- 15-Setembro-2024 private function makePaymentToStoreWallets(Request $request, $generated_payment, $userPayer, $accountPayer, $accountPayerOld) { $this->validate($request, [ 'store_account_number' => 'required|numeric', ], [ 'store_account_number.required' => 'O numero da loja e obrigatorio', 'store_account_number.numeric' => 'O numero da loja deve ser numerico', ]); // Buscar a loja onde se fara o pagamento $store_account = Store::getStoreAccount($request->store_account_number); if (!$store_account) return SendResponse::errorResp404notfound( 'Conta da loja não encontrada', 'StoreAccount Not Found', ); $store_account_old = Store::getStoreAccount($request->store_account_number); $store_contract = Store::getStoreContractsAndConfigs($store_account->account_number); $business = BusinessAccount::getBusinessAccountByID($store_account->business_account_id); if (!$business) return SendResponse::errorResp404notfound( 'Conta da loja não associada a conta Empresa', 'Store account not associated with Company account', ); //validar KYC da Loja $storeKyc = new StoreKyc($store_contract); $respStoreKyc = $storeKyc->checkStoreKYC($request->amount); if ($respStoreKyc->getStatusCode() != 200) return $respStoreKyc; // Calculos para efectuar pagamento $imali_commission = $request->amount * ($store_contract->taxa) / 100; $points = round($request->amount); // Efectuar o Pagamento.. try { DB::beginTransaction(); // adicionar o valor retirado na conta do accountPayer no balance da Loja $store_account->balance += ($request->amount - $imali_commission); $store_account->update(); // adicionar o valor retirado na conta do accountPayer no balance da Loja $business->balance += ($request->amount - $imali_commission); $business->update(); // Criar pagamento $created_payment = $this->create_payment_store_transaction($generated_payment, $request, $userPayer, $accountPayer, $accountPayerOld, $store_account, $store_account_old, $imali_commission, $points); // criar dependencias de pagamentos $this->create_payment_dependences($userPayer, $created_payment, $accountPayer, $request, $imali_commission, $points); // envio de notificacoes $this->send_payment_notifications($request, $store_contract, $userPayer, $accountPayer, $created_payment); DB::commit(); Log::info('Outgoing response', [ 'content' => [ 'message' => trans('payment_done'), 'transaction' => $created_payment->transaction_id, 'created_at' => $created_payment->created_at ], ]); return response()->json([ 'message' => trans('payment_done'), 'transaction' => $created_payment->transaction_id, 'created_at' => $created_payment->created_at ]); } catch (\Throwable $th) { DB::rollBack(); Log::info('Error response', [ 'content' => [ 'message' => 'Falha no pagamento', 'data' => $th->getMessage(), ], ]); // Escrever no ficheiro de log as mensagens de erro. return response()->json(['message' => 'Falha no pagamento', $th->getMessage(), $th->getLine()], 500); } } // TODO -- NEW 25 private function create_payment_store_wallets_transaction($request, $store_account, $store_account_old, $business, $imali_commission, $points, $generated_push_payment, $userPayer = null, $accountPayer = null, $accountPayerOld = null) { // Registar o pagamento na tabela de Payment $payment_type = PaymentType::query()->where('id', $generated_push_payment->payment_types_id)->first(); $created_payment = Payment::create([ 'transaction_id' => $generated_push_payment->transaction_id, 'service_transaction_id' => $generated_push_payment->thirdparty_transaction_id, 'partner_transaction_id' => $request->partner_transaction_id, 'sender_account_number' => $generated_push_payment->client_account_number, 'store_id' => $store_account->id, 'received_points' => $points, 'amount' => $request->amount, 'amount_debited' => $request->amount, 'amount_credited' => $request->amount - $imali_commission, 'comissao' => $imali_commission, 'description' => $request->description, 'used_points' => $request->used_points, 'estado' => 'success', 'status' => 'success', 'payment_type' => $payment_type->name, 'estado_color' => '#388E3C', 'sender_id' => $userPayer ? $userPayer->id : null, 'sender_name' => $userPayer ? $userPayer->name : null, 'old_balance' => $accountPayerOld ? $accountPayerOld->balance : 0, 'new_balance' => $accountPayer ? $accountPayer->balance : 0, 'old_store_balance' => $store_account_old->balance, 'new_store_balance' => $store_account->balance, 'category_id' => $store_account->industry_activity, 'business_account_id' => $business->id, 'payment_requests_id' => $generated_push_payment ? $generated_push_payment->id : null, 'transaction_type' => 'debit', 'transaction_name' => 'Pagamento' ]); if ($generated_push_payment) { $convert = strtotime(date('Y-m-d H:i:s')) - (60 * 4); $duration = date("Y-m-d H:i:s", $convert); $generated_push_payment->status = 'SUCCESS'; $generated_push_payment->is_payment_confirmed = 1; $generated_push_payment->expiration_datetime = $duration; $generated_push_payment->update(); if ($generated_push_payment->link_id) { $link = Link::query() ->where('link_id', $generated_push_payment->link_id) ->where('status', 'PENDING') ->first(); if ($link) { $link->status = 'USED'; $link->update(); $payment_link = Payment::where('transaction_id', $created_payment->transaction_id)->first(); $payment_link->links_id = $link->id; $payment_link->link_id_key = $link->link_id; $payment_link->save(); } } } // Dados para nova tabela de All Transactions // REGISTO DE DEBITO PARA O CLIENTE AllTransactionController::create_all_transaction( $created_payment->transaction_id, 1, 1, $created_payment->sender_name, $created_payment->sender_account_number, 1, $store_account->name, $store_account->account_number, 3, $created_payment->amount, 'Pagamento ' . $created_payment->source, $created_payment->old_balance, $created_payment->new_balance, $created_payment->old_store_balance, $created_payment->new_store_balance + $imali_commission, $created_payment->status, $created_payment->created_at, 'DEBIT', ); // REGISTO DE CREDITO PARA LOJA AllTransactionController::create_all_transaction( $created_payment->transaction_id, 1, 1, $created_payment->sender_name, $created_payment->sender_account_number, 1, $store_account->name, $store_account->account_number, 3, $created_payment->amount, 'Pagamento ' . $created_payment->source, $created_payment->old_balance, $created_payment->new_balance, $created_payment->old_store_balance, $created_payment->new_store_balance + $imali_commission, $created_payment->status, $created_payment->created_at, 'CREDIT', ); // REGISTO DE DEBITO PARA A LOJA AllTransactionController::create_all_transaction( $created_payment->transaction_id, 7, 1, $store_account->name, $store_account->account_number, 3, 'iMali', '11900', 9, $created_payment->comissao, 'Pagamento ' . $created_payment->source, $created_payment->new_store_balance + $created_payment->comissao, $created_payment->new_store_balance, 0, 0, $created_payment->status, $created_payment->created_at, 'DEBIT', ); // REGISTO DE DEBITO DA TAXA PARA LOJA // $store_account->balance -= $imali_commission; // $store_account->update(); return $created_payment; } private function create_payment_store_qrcode_transaction($request, $store_account, $store_account_old, $business, $imali_commission, $points, $generated_qrcode_payment, $accountPayer) { // Registar o pagamento na tabela de Payment $payment_type = PaymentType::query()->where('id', 1)->first(); $created_payment = Payment::create([ 'transaction_id' => $generated_qrcode_payment->qrcode_id, // 'service_transaction_id' => $generated_qrcode_payment->thirdparty_transaction_id, 'partner_transaction_id' => $generated_qrcode_payment->partner_transaction_id, 'sender_account_number' => $accountPayer->account_number, 'store_id' => $store_account->id, 'received_points' => $points, 'amount' => $request->amount, 'amount_debited' => $request->amount, 'amount_credited' => $request->amount - $imali_commission, 'comissao' => $imali_commission, 'description' => $generated_qrcode_payment->description, 'used_points' => $request->used_points, 'estado' => 'success', 'status' => 'success', 'payment_type' => $payment_type->name, 'estado_color' => '#388E3C', 'old_store_balance' => $store_account_old->balance, 'new_store_balance' => $store_account->balance, 'category_id' => $store_account->industry_activity, 'business_account_id' => $business->id, 'payment_requests_id' => $generated_qrcode_payment ? $generated_qrcode_payment->id : null, 'links_id' => $generated_qrcode_payment ? $generated_qrcode_payment->id : null, 'links_id_key' => $generated_qrcode_payment ? $generated_qrcode_payment->link_id : null, 'transaction_type' => 'debit', 'transaction_name' => 'Pagamento' ]); if ($generated_qrcode_payment) { $convert = strtotime(date('Y-m-d H:i:s')) - (60 * 4); $duration = date("Y-m-d H:i:s", $convert); $generated_qrcode_payment->status = 'USED'; $generated_qrcode_payment->expiration_datetime = $duration; $generated_qrcode_payment->update(); if ($generated_qrcode_payment->link_id) { $link = Link::query() ->where('link_id', $generated_qrcode_payment->link_id) ->where('status', 'PENDING') ->first(); if ($link) { $link->status = 'USED'; $link->update(); } } } // Dados para nova tabela de All Transactions // REGISTO DE DEBITO PARA O CLIENTE AllTransactionController::create_all_transaction( $created_payment->transaction_id, 1, 1, $created_payment->sender_name, $created_payment->sender_account_number, 1, $store_account->name, $store_account->account_number, 3, $created_payment->amount, 'Pagamento ' . $created_payment->source, $created_payment->old_balance, $created_payment->new_balance, $created_payment->old_store_balance, $created_payment->new_store_balance + $imali_commission, $created_payment->status, $created_payment->created_at, 'DEBIT', ); // REGISTO DE CREDITO PARA LOJA AllTransactionController::create_all_transaction( $created_payment->transaction_id, 1, 1, $created_payment->sender_name, $created_payment->sender_account_number, 1, $store_account->name, $store_account->account_number, 3, $created_payment->amount, 'Pagamento ' . $created_payment->source, $created_payment->old_balance, $created_payment->new_balance, $created_payment->old_store_balance, $created_payment->new_store_balance + $imali_commission, $created_payment->status, $created_payment->created_at, 'CREDIT', ); // REGISTO DE DEBITO PARA A LOJA AllTransactionController::create_all_transaction( $created_payment->transaction_id, 7, 1, $store_account->name, $store_account->account_number, 3, 'iMali', '11900', 9, $created_payment->comissao, 'Pagamento ' . $created_payment->source, $created_payment->new_store_balance + $created_payment->comissao, $created_payment->new_store_balance, 0, 0, $created_payment->status, $created_payment->created_at, 'DEBIT', ); // REGISTO DE DEBITO DA TAXA PARA LOJA // $store_account->balance -= $imali_commission; // $store_account->update(); return $created_payment; } // TODO -- 15-Setembro-2024 private function create_payment_store_transaction($generated_payment, $request, $userPayer, $accountPayer, $accountPayerOld, $store_account, $store_account_old, $imali_commission, $points, $sub_account = null, $sub_account_old = null, $generated_push_payment = null) { // $created_payment = new Payment(); // Registar o pagamento na tabela de Payment if ($generated_payment) { $generated_payment->update([ 'received_points' => $points, 'amount_credited' => $request->amount, 'comissao' => $imali_commission, 'description' => $request->description, 'used_points' => $request->used_points, 'estado' => 'success', 'status' => 'success', 'estado_color' => '#388E3C', 'old_balance' => $accountPayerOld->balance, 'new_balance' => $accountPayer->balance, 'sender_id' => $userPayer ? $userPayer->id : $userPayer, 'sender_name' => $userPayer ? $userPayer->name : $userPayer, 'sender_account_number' => $accountPayer ? $accountPayer->account_number : $accountPayer, 'sender_card_number' => $accountPayer ? $accountPayer->card_number : $accountPayer, 'transaction_type' => 'debit', 'transaction_name' => 'Pagamento', 'category_id' => $store_account->industry_activity ]); $created_payment = $generated_payment; } else if ($generated_push_payment) { $created_payment = Payment::create([ // 'transaction_id' => $this->trasactionGeneration->generateTransaction(), 'transaction_id' => $generated_push_payment->transaction_id, 'service_transaction_id' => $generated_push_payment->thirdparty_transaction_id, 'partner_transaction_id' => $request->partner_transaction_id, 'terminalID' => $request->terminal_id, 'sender_id' => $userPayer ? $userPayer->id : $userPayer, 'sender_name' => $userPayer ? $userPayer->name : $userPayer, 'sender_account_number' => $accountPayer ? $accountPayer->account_number : $accountPayer, 'sender_card_number' => $accountPayer ? $accountPayer->card_number : $accountPayer, 'store_id' => $store_account->id, 'received_points' => $points, 'amount' => $request->amount, 'amount_debited' => $request->amount, 'amount_credited' => $request->amount - $imali_commission, 'comissao' => $imali_commission, 'description' => $request->description, 'used_points' => $request->used_points, 'estado' => 'success', 'status' => 'success', 'payment_type' => 'directo', 'estado_color' => '#388E3C', 'old_balance' => $accountPayerOld ? $accountPayerOld->balance : $accountPayerOld, 'new_balance' => $accountPayer ? $accountPayer->balance : $accountPayer, 'old_store_balance' => $store_account_old->balance, 'new_store_balance' => $store_account->balance, 'category_id' => $store_account->industry_activity, // 'push_id' => $generated_push_payment ? $generated_push_payment->push_id : null, // 'push_payment_requests_id' => $generated_push_payment ? $generated_push_payment->id : null, 'payment_requests_id' => $generated_push_payment ? $generated_push_payment->id : null, 'transaction_type' => 'debit', 'transaction_name' => 'Pagamento' ]); if ($generated_push_payment) { $generated_push_payment->status = 'SUCCESS'; $generated_push_payment->update(); } } else { $new_payment = Payment::create([ 'transaction_id' => $this->trasactionGeneration->generateTransaction(), 'partner_transaction_id' => $request->partner_transaction_id, 'terminalID' => $request->terminal_id, 'sender_id' => $userPayer ? $userPayer->id : $userPayer, 'sender_name' => $userPayer ? $userPayer->name : $userPayer, 'sender_account_number' => $accountPayer ? $accountPayer->account_number : $accountPayer, 'sender_card_number' => $accountPayer ? $accountPayer->card_number : $accountPayer, 'store_id' => $store_account->id, 'received_points' => $points, 'amount' => $request->amount, 'amount_debited' => $request->amount, 'amount_credited' => $request->amount - $imali_commission, 'comissao' => $imali_commission, 'description' => $request->description, 'used_points' => $request->used_points, 'estado' => 'success', 'status' => 'success', 'payment_type' => 'directo', 'estado_color' => '#388E3C', 'old_balance' => $accountPayerOld ? $accountPayerOld->balance : $accountPayerOld, 'new_balance' => $accountPayer ? $accountPayer->balance : $accountPayer, 'old_store_balance' => $store_account_old->balance, 'new_store_balance' => $store_account->balance, 'category_id' => $store_account->industry_activity, 'transaction_type' => 'debit', 'transaction_name' => 'Pagamento' ]); $created_payment = $new_payment; } // Dados para nova tabela de All Transactions // REGISTO DE DEBITO PARA O CLIENTE AllTransactionController::create_all_transaction( $created_payment->transaction_id, 1, 1, $created_payment->sender_name, $created_payment->sender_account_number, 1, $store_account->name, $store_account->account_number, 3, $created_payment->amount, 'Pagamento ' . $created_payment->source, $created_payment->old_balance, $created_payment->new_balance, $created_payment->old_store_balance, $created_payment->new_store_balance + $imali_commission, $created_payment->status, $created_payment->created_at, 'DEBIT', ); // REGISTO DE CREDITO PARA LOJA AllTransactionController::create_all_transaction( $created_payment->transaction_id, 1, 1, $created_payment->sender_name, $created_payment->sender_account_number, 1, $store_account->name, $store_account->account_number, 3, $created_payment->amount, 'Pagamento ' . $created_payment->source, $created_payment->old_balance, $created_payment->new_balance, $created_payment->old_store_balance, $created_payment->new_store_balance + $imali_commission, $created_payment->status, $created_payment->created_at, 'CREDIT', ); // REGISTO DE DEBITO PARA A LOJA AllTransactionController::create_all_transaction( $created_payment->transaction_id, 7, 1, $store_account->name, $store_account->account_number, 3, 'iMali', '11900', 9, $created_payment->comissao, 'Pagamento ' . $created_payment->source, $created_payment->new_store_balance + $created_payment->comissao, $created_payment->new_store_balance, 0, 0, $created_payment->status, $created_payment->created_at, 'DEBIT', ); // REGISTO DE DEBITO DA TAXA PARA LOJA // $store_account->balance -= $imali_commission; // $store_account->update(); return $created_payment; } // TODO -- 15-Setembro-2024 private function create_payment_dependences($userPayer, $created_payment, $accountPayer, $request, $imali_commission, $points) { TransactionHistory::create([ 'user_id' => $userPayer->id, 'payment_id' => $created_payment->id, 'transaction_type' => 'payment', ]); HistoryPayment::create([ 'sender_account' => $accountPayer->account_number, 'sender_name' => $userPayer->name, 'amount_credited' => $request->amount, 'status_user' => 'sender', 'status' => 'done', 'comissao' => $imali_commission, 'amount' => $request->amount, 'user_id' => $userPayer->id, 'actual_points' => $points, 'last_points' => $points, 'win_points' => $points, 'transaction_id' => $created_payment->transaction_id, 'payment_id' => $created_payment->id ]); Profit::create([ 'payer_id' => $userPayer->id, 'payer_account' => $userPayer->account_number, 'amount' => $request->amount, 'amount_credited' => $request->amount, 'comissao' => $imali_commission, 'profit_id' => $this->trasactionGeneration->generateTransaction(), 'payment_id' => $created_payment->id, 'profit_payer_id' => $created_payment->store_id ]); } public function makePaymentStoreAppNew(Request $request) { Log::info('Outgoing Response', [ 'content' => $request->all(), ]); $this->validate($request, [ 'account_number' => 'required', 'amount' => 'required', //'description' => 'required|max:30' ]); $pay = Payment::query()->where('transaction_id', $request->transaction)->first(); if (($pay && $pay->status === 'rejected') || ($pay && $pay->status === 'expired')) { return response()->json(['message' => trans('payment_invalid'), 'status' => 401], 406); } $kyc = new Kyc(); $kycCheck = $kyc->checkSenderPayment($request); if ($kycCheck) { $log = new Record(); $log->createLog([ 'description' => "Payment Fail", 'details' => $kycCheck, 'operation' => 'Payment', 'properties' => json_encode($request->except(['pin'])), 'status' => 'Error', 'user_id' => $request->user()->id ]); // $pay->update([ // 'estado' => 'rejected', // 'status' => 'rejected', // 'description' => $kycCheck->getData()->message, // 'created_at' => now(), // 'updated_at' => now() // ]); return $kycCheck; } else { $this->request = $request; DB::transaction(function () { $store = DB::table('stores')->where('account_number', $this->request->account_number)->first(); $imaliAccount = DB::table('users') ->join('imali_accounts', 'imali_accounts.user_id', '=', 'users.id') ->where('users.user_id', $this->request->user()->user_id) ->select('users.*', 'imali_accounts.account_number', 'imali_accounts.points', 'imali_accounts.balance') ->first(); $valorAPagar = $this->request->amount; $points = round($valorAPagar); // Payer or Sender Section DB::table('imali_accounts')->where('user_id', $imaliAccount->id)->decrement('balance', $valorAPagar); DB::table('imali_accounts')->where('user_id', $imaliAccount->id)->increment('points', $points); // $contractoComerciante = MerchantContract::query()->where('store_id', '=', $store->id)->first(); $contractoComerciante = DB::table('merchant_contracts')->where('store_id', '=', $store->id)->first(); $taxaDesconto = $valorAPagar * ($contractoComerciante->taxa) / 100; $valorMin = $contractoComerciante->min_amount; $valorMax = $contractoComerciante->max_amount; if ($taxaDesconto < $valorMin) { $taxaDesconto = $valorMin; } if ($taxaDesconto > $valorMax) { $taxaDesconto = $valorMax; } // $valorFinal = $valorAPagar - $valorAPagar*($contractoComerciante->taxa)/100; $valorFinal = $valorAPagar - $taxaDesconto; // Recever User Merchante DB::table('stores')->where('account_number', $store->account_number)->increment('balance', $valorFinal); // Add Money to Merchant // $storeT = Store::query()->where('account_number', $store->account_number)->first(); // DB::table('merchant_accounts')->where('id', $storeT->merchant_account_id)->increment('balance', $valorFinal); // $profit = $valorAPagar*($contractoComerciante->taxa)/100; $this->generatedTransaction = $this->trasactionGeneration->generateTransaction(); $getPayment = DB::table('payments')->where('transaction_id', $this->request->transaction)->first(); $imaliAccount2 = DB::table('users') ->join('imali_accounts', 'imali_accounts.user_id', '=', 'users.id') ->where('users.user_id', $this->request->user()->user_id) ->select('users.*', 'imali_accounts.account_number', 'imali_accounts.points', 'imali_accounts.balance') ->first(); if ($getPayment) { DB::table('payments') ->where('transaction_id', $this->request->transaction) ->update([ 'received_points' => $points, 'amount_credited' => $valorFinal, 'comissao' => $taxaDesconto, 'description' => $this->request->description, 'used_points' => $this->request->used_points, 'estado' => 'success', 'status' => 'success', 'payment_type' => 'directo', 'estado_color' => '#388E3C', 'sender_id' => $imaliAccount->id, 'updated_at' => now(), 'old_balance' => $imaliAccount->balance, 'new_balance' => $imaliAccount2->balance ]); $this->createTransaction = DB::table('payments')->where('transaction_id', $this->request->transaction)->first(); } else { DB::table('payments')->insert([ 'transaction_id' => $this->generatedTransaction, 'sender_id' => $imaliAccount->id, 'store_id' => $store->id, 'client_id' => $this->request->user_client_id, 'received_points' => $points, 'amount' => $valorAPagar, 'amount_credited' => $valorFinal, 'comissao' => $taxaDesconto, 'description' => $this->request->description, 'used_points' => $this->request->used_points, 'estado' => 'success', 'status' => 'success', 'payment_type' => 'directo', 'estado_color' => '#388E3C', 'created_at' => now(), 'updated_at' => now(), 'category_id' => $store->industry_activity, 'old_balance' => $imaliAccount->balance, 'new_balance' => $imaliAccount2->balance ]); $this->createTransaction = DB::table('payments')->where('transaction_id', $this->generatedTransaction)->first(); } DB::table('transaction_histories')->insert([ 'user_id' => $this->request->user()->id, 'payment_id' => $this->createTransaction->id, 'category_id' => $this->createTransaction->category_id, 'transaction_type' => 'payment', 'created_at' => now(), 'updated_at' => now() ]); $actualPoints = $imaliAccount->points + $points; DB::table('history_payments')->insert([ 'sender_account' => $imaliAccount->account_number, 'sender_name' => $imaliAccount->name, 'amount_credited' => $valorFinal, 'status_user' => 'sender', 'status' => 'done', 'comissao' => $taxaDesconto, 'amount' => $valorAPagar, 'user_id' => $imaliAccount->id, 'actual_points' => $actualPoints, 'last_points' => $imaliAccount->points, 'win_points' => $points, 'transaction_id' => $this->generatedTransaction, 'category_id' => $store->industry_activity, 'payment_id' => $this->createTransaction->id, 'created_at' => now(), 'updated_at' => now() ]); DB::table('profits')->insert([ 'payer_id' => $imaliAccount->id, 'payer_account' => $store->account_number, 'amount' => $valorAPagar, 'amount_credited' => $valorFinal, 'comissao' => $taxaDesconto, 'profit_id' => $this->trasactionGeneration->generateTransaction(), 'payment_id' => $this->createTransaction->id, 'profit_payer_id' => $this->createTransaction->store_id, 'created_at' => now(), 'updated_at' => now() ]); DB::table('logs')->insert([ 'description' => $imaliAccount->account_number . ' ' . $store->name, 'details' => trans('payment_done'), 'operation' => 'Payment', 'properties' => json_encode($this->request->except(['pin'])), 'status' => 'success', 'user_id' => $this->request->user()->id ]); $notification = array( // 'icon' => 'ic_imali_logo_verde_01', 'icon' => 'ic_i_mali_cover', 'title' => 'Pagamento ' . $this->request->amount . ' MT', 'body' => 'Parabéns, ' . ' fez o pagamento de ' . $this->request->amount . ' MT ' . ' na loja ' . $store->name, 'click_action' => 'com.imali.payapp.payment_PAGAR_NOTIFICATION', 'color' => '#ffffff' ); $notificationStore = array( 'icon' => 'ic_imali_logo_verde_01', 'image' => 'https://imali.co.mz/wp-content/uploads/2022/04/iMali-Business-Logo.png', // 'icon' => 'ic_i_mali_cover', 'title' => 'Pagamento ' . $this->request->amount . ' MT', 'body' => 'Parabéns, ' . ' recebeu o pagamento de ' . $this->request->amount . ' MT ' . ' do cliente ' . $imaliAccount->name, 'click_action' => 'mz.co.imali.business.payment_TARGET_NOTIFICATION', 'color' => '#ffffff' ); $store = DB::table('stores')->where('account_number', $this->request->account_number)->first(); $category = RamoActivity::find($store->industry_activity); $data = array( 'transaction' => $this->createTransaction->transaction_id, 'loja' => $store->name, 'name' => $imaliAccount->name, 'loja_account' => $store->account_number, 'pontos' => $this->createTransaction->received_points, 'pontos_usados' => $this->createTransaction->used_points, 'amount' => $this->createTransaction->amount, 'amount_debited' => $this->createTransaction->amount_credited, 'amount_credited' => $this->createTransaction->amount_credited, 'account_number' => $imaliAccount->account_number, 'phone' => $this->request->user()->phone, 'descricao' => $this->createTransaction->description, 'data' => $this->createTransaction->created_at, 'created_at' => $this->createTransaction->created_at, 'estado' => $this->createTransaction->estado, 'comissao' => $this->createTransaction->comissao, 'message_store' => trans('payment_received'), 'message_customer' => trans('payment_done'), 'logo_category' => $category->logo, 'category' => $category->nome, 'route' => 'PAGAR_NOTIFICATION', 'terminal' => 'firebase' ); // Notifify customer $this->pushNotifification($imaliAccount->firebase_token, $notification, $data); $storeConfig = StoreConfig::query() ->where('store_id', '=', $store->id) ->first(); if ($storeConfig) { if ($storeConfig->notify === 1) { // NOTIFY STORE BY SMS if ($storeConfig->notify_sms === 1) { $sms = new SendSMSSislog(); $data = array( "sender_id" => $this->createTransaction->sender_id, "store_id" => $this->createTransaction->store_id, "transaction_id" => $this->createTransaction->transaction_id, "created_at" => $this->createTransaction->created_at, "amount" => $this->createTransaction->amount, ); $this->smsManager->sendSMSToComerciante($data); } if ($storeConfig->notify_email == 1) { } // NOTIFY STORE if ($storeConfig->notify_push == 1) { if ($getPayment) { $this->pushNotifification($getPayment->firebase_token, $notificationStore, $data); } else { $device = StoreDevice::query() ->where('store_id', $store->id) ->where('status', '=', 1) ->get(); foreach ($device as $d) { $this->pushNotifification($d->firebase_token, $notificationStore, $data); } } } } } }, 2); return response()->json([ 'message' => trans('payment_done'), 'transaction' => $this->generatedTransaction, 'created_at' => $this->createTransaction->created_at, 'duration' => 3000, ]); } } //? Payment With SubAccounts // todo --- FUNCIONA PRODUÇÃO -- 16-Setembro-2024 🧣👍🏽 public function makePaymentStoreApp2024SubAccounts(Request $request) { // QR Static // QR Dynamic // QR Store Number //? Payment by Link // Reembolso // Payment Push // New Parameter - account_type = subaccount $this->validate( $request, [ 'amount' => 'required', 'card_number' => 'required', //'terminal_id' => 'required', 'account_number' => 'required', 'partner_transaction_id' => 'required|unique:payments', 'is_real_payment' => 'in:0,1', ], [ 'amount.required' => 'Campo amount é obrigatório', 'card_number.required' => 'Campo card_number é obrigatório', //'terminal_id.required' => 'Campo terminal_id é obrigatório', 'account_number.required' => 'Campo account_number é obrigatório', 'partner_transaction_id.required' => 'Campo partner_transaction_id é obrigatório', 'partner_transaction_id.unique' => 'Campo partner_transaction_id ja existe', 'is_real_payment.in' => 'Campo is_real_payment aceita 0 ou 1 (0 - pagamento ficticio, 1 - pagamento real)', ] ); $accountPayer = User::getAccount($request->card_number); if (!$accountPayer) return response()->json(['message' => 'O cartão informado para pagamento não existe.'], 404); $accountPayerOld = User::getAccount($request->card_number); $userPayer = User::getUserDetails($accountPayer->user_id, $accountPayer->account_number); // Validar KYC do userPayer $kyc = new UserKyc($userPayer); $kycResp = $kyc->checkSenderKYC($request->amount); if ($kycResp->getStatusCode() != 200) return $kycResp; // Validacao do saldo do User //$kycRespBalance = $kyc->checkUserBalance($request->amount); $kycRespBalance = $kyc->checkUserCardBalance($request->amount); if ($kycRespBalance->getStatusCode() != 200) return $kycRespBalance; // Buscar a loja onde se fara o pagamento $store_account_old = Store::getStoreAccount($request->account_number); $store_account = Store::getStoreAccount($request->account_number); // return $store_account; $store_contract = Store::getStoreContractsAndConfigs($request->account_number); if (!$store_contract) return response()->json(['message' => 'Falha no pagamento, nao e possivel executar a operacao, tente novamente'], 400); // return $store_contract; //validar KYC da Loja $storeKyc = new StoreKyc($store_contract); $respStoreKyc = $storeKyc->checkStoreKYC($request->amount); if ($respStoreKyc->getStatusCode() != 200) return $respStoreKyc; // Calculos para efectuar pagamento if ($request->has('is_real_payment') && $request->is_real_payment) $imali_commission = $request->amount * ($store_contract->taxa) / 100; else $imali_commission = 0; $points = round($request->amount); // Efectuar o Pagamento.. try { DB::beginTransaction(); // retirar o valor a pagar do saldo do User que esta a pagar $accountPayer->balance -= $request->amount; $accountPayer->update(); if ($request->has('is_real_payment') && $request->is_real_payment) { // adicionar o valor retirado na conta do accountPayer no balance da Loja $store_account->balance += $request->amount - $imali_commission; $store_account->update(); } // Criar pagamento $created_payment = $this->create_payment_transaction(null, $request, $userPayer, $accountPayer, $accountPayerOld, $store_account, $store_account_old, $imali_commission, $points); // criar dependencias de pagamentos $this->create_payment_dependences($userPayer, $created_payment, $accountPayer, $request, $imali_commission, $points); // envio de notificacoes $this->send_payment_notifications($request, $store_contract, $userPayer, $accountPayer, $created_payment); DB::commit(); Log::info('Outgoing Response Success', [ 'message' => 'Transaction Successfull' ]); return response()->json([ 'message' => trans('payment_done'), 'transaction' => $created_payment->transaction_id, 'created_at' => $created_payment->created_at ]); } catch (\Throwable $th) { DB::rollBack(); Log::info('Outgoing Response Error', [ 'content' => $th->getMessage() ]); // Escrever no ficheiro de log as mensagens de erro. return response()->json(['message' => 'Falha no pagamento', $th->getMessage()], 500); } } //? Payment With SubAccounts public function makePaymentStoreApp2024(Request $request) { //return response()->json(['message' => "Chegou"], 404); //Log::info('Outgoing Response', [ // 'content' => $request->all(), //]); // QR Static // QR Dynamic // QR Store Number //? Payment by Link // Reembolso // Payment Push $this->validate($request, [ 'account_number' => 'required', 'amount' => 'required' ]); $request->request->add(['is_real_payment' => true]); // Indentificar se o pagamento ja existe e o seu estado e rejected ou expired $generated_payment = Payment::query()->where('transaction_id', $request->transaction)->first(); if (($generated_payment && $generated_payment->status === 'rejected') || ($generated_payment && $generated_payment->status === 'expired') || ($generated_payment && $generated_payment->status === 'success')) return response()->json(['message' => trans('payment_invalid'), 'status' => 401], 406); // Validar o PIN e Fingerprint do userPayer $auth = new ClassesAuth(); $authResp = $auth->checkUserPinAndFingerprint($request); if ($authResp->getStatusCode() != 200) return $authResp; // return 'Validou tudo!'; // Buscar dados do User que faz a transacao $userPayer = User::getUserDetails(auth()->user()->id); // Buscar dados da conta do User que faz a transacao $accountPayer = User::getAccountByUser($userPayer->id, $userPayer->account_id); // return $accountPayer; $accountPayerOld = User::getAccountByUser($userPayer->id, $userPayer->account_id); // Validar KYC do userPayer $kyc = new UserKyc($userPayer); $kycResp = $kyc->checkSenderKYC($request->amount); if ($kycResp->getStatusCode() != 200) return $kycResp; // Validacao do saldo do User $kycRespBalance = $kyc->checkUserBalance($request->amount); if ($kycRespBalance->getStatusCode() != 200) return $kycRespBalance; if (User::is_subAccount($request->account_number)) { $sub_a = User::getAccount($request->account_number); $st = Store::query()->where('id', $sub_a->store_id)->first(); $store_account_old = Store::getStoreAccount($st->account_number); $store_account = Store::getStoreAccount($st->account_number); $store_contract = Store::getStoreContractsAndConfigs($st->account_number); $request->request->add(['sub_account_number' => $request->account_number]); } else { // Buscar a loja onde se fara o pagamento $store_account_old = Store::getStoreAccount($request->account_number); $store_account = Store::getStoreAccount($request->account_number); $store_contract = Store::getStoreContractsAndConfigs($request->account_number); } // Buscar a loja onde se fara o pagamento //$store_account_old = Store::getStoreAccount($request->account_number); //$store_account = Store::getStoreAccount($request->account_number); //$store_contract = Store::getStoreContractsAndConfigs($request->account_number); $sub_account = null; $sub_account_old = null; // VERIFICAR SE ESTA A SER ENVIDO O CARD NUMBER if ($request->has('sub_account_number')) { //if ($request->has('sub_account_number')) { $sub_account = User::getAccount($request->sub_account_number); $sub_account_old = User::getAccount($request->sub_account_number); if (!$sub_account) return response()->json(['message' => 'Subconta invalida'], 400); //if ($sub_account->sub_account_types_id != 7) return response()->json(['message' => 'A tua subconta deve ser do tipo Cartao'], 400); //if ($sub_account->store_id != $store_account->id) return response()->json(['message' => 'Numero de Comerciante/Loja invalido'], 400); $subC_type = SubAccountType::query()->where('id', $sub_account->sub_account_types_id)->where('type_id', 'NFC_CARD')->first(); if (!$subC_type) return response()->json(['message' => 'A tua subconta deve ser do tipo Cartao'], 400); } //validar KYC da Loja $storeKyc = new StoreKyc($store_contract); $respStoreKyc = $storeKyc->checkStoreKYC($request->amount); if ($respStoreKyc->getStatusCode() != 200) return $respStoreKyc; // Calculos para efectuar pagamento $imali_commission = $request->amount * ($store_contract->taxa) / 100; $points = round($request->amount); // Efectuar o Pagamento.. try { DB::beginTransaction(); // retirar o valor a pagar do saldo do User que esta a pagar $accountPayer->balance -= $request->amount; $accountPayer->update(); // adicionar o valor retirado na conta do accountPayer no balance da Loja $store_account->balance += ($request->amount - $imali_commission); $store_account->update(); // VERIFICAR SE ESTA A SER ENVIDO O CARD NUMBER // se existir uma subconta entao sera feito o credito do valor na loja e credito "ficticio" na subconta // no acto de pagamento via cartao e feito debito na subonta e o credito a zero "0" na loja //if ($request->has('sub_account_number')) { if ($request->has('sub_account_number')) { $sub_account->balance += $request->amount; $sub_account->update(); } // Criar pagamento //$created_payment = $this->create_payment_transaction($generated_payment, $request, $userPayer, $accountPayer, $accountPayerOld, $store_account, $imali_commission, $points); $created_payment = $this->create_payment_transaction($generated_payment, $request, $userPayer, $accountPayer, $accountPayerOld, $store_account, $store_account_old, $imali_commission, $points, $sub_account, $sub_account_old); // criar dependencias de pagamentos $this->create_payment_dependences($userPayer, $created_payment, $accountPayer, $request, $imali_commission, $points); // envio de notificacoes $this->send_payment_notifications($request, $store_contract, $userPayer, $accountPayer, $created_payment); DB::commit(); return response()->json([ 'message' => trans('payment_done'), 'transaction' => $created_payment->transaction_id, 'created_at' => $created_payment->created_at ]); } catch (\Throwable $th) { DB::rollBack(); // Escrever no ficheiro de log as mensagens de erro. return response()->json(['message' => 'Falha no pagamento', $th->getMessage()], 500); } } //private function create_payment_transaction($generated_payment, $request, $userPayer, $accountPayer, $accountPayerOld, $store_account, $imali_commission, $points) private function create_payment_transaction($generated_payment, $request, $userPayer, $accountPayer, $accountPayerOld, $store_account, $store_account_old, $imali_commission, $points, $sub_account = null, $sub_account_old = null) { $created_payment = new Payment(); // Registar o pagamento na tabela de Payment if ($generated_payment) { $generated_payment->update([ 'received_points' => $points, 'amount_credited' => $request->amount, 'comissao' => $imali_commission, 'description' => $request->description, 'used_points' => $request->used_points, 'estado' => 'success', 'status' => 'success', 'estado_color' => '#388E3C', 'sender_id' => $userPayer->id, 'old_balance' => $accountPayerOld->balance, 'new_balance' => $accountPayer->balance ]); $created_payment = $generated_payment; } else { if ($request->has('is_real_payment') && $request->is_real_payment) { $new_payment = Payment::create([ 'transaction_id' => $this->trasactionGeneration->generateTransaction(), 'partner_transaction_id' => $request->partner_transaction_id, 'terminalID' => $request->terminal_id, 'sender_id' => $userPayer->id, 'sender_name' => $userPayer->name, 'sender_account_number' => $accountPayer->account_number, 'sender_card_number' => $accountPayer->card_number, //'sender_card_number' => $sub_account?$sub_account->card_number:null, 'store_id' => $store_account->id, 'received_points' => $points, 'amount' => $request->amount, 'amount_debited' => $request->amount, 'amount_credited' => $request->amount - $imali_commission, 'comissao' => $imali_commission, 'description' => $request->description, 'used_points' => $request->used_points, 'estado' => 'success', 'status' => 'success', 'payment_type' => 'directo', 'estado_color' => '#388E3C', 'old_balance' => $accountPayerOld->balance, 'new_balance' => $accountPayer->balance, 'old_store_balance' => $store_account_old->balance, 'new_store_balance' => $store_account->balance, 'category_id' => $store_account->industry_activity, 'transaction_type' => 'debit', 'transaction_name' => 'Pagamento' ]); if ($request->has('sub_account_number')) { Payment::create([ 'transaction_id' => $this->trasactionGeneration->generateTransaction(), 'partner_transaction_id' => $request->partner_transaction_id, 'terminalID' => $request->terminal_id, 'sender_id' => $userPayer->id, 'sender_name' => $userPayer->name, 'sender_account_number' => $accountPayer->account_number, 'sender_card_number' => $sub_account ? $sub_account->card_number : null, 'store_id' => $store_account->id, 'received_points' => $points, 'amount' => $request->amount, 'amount_debited' => $request->amount, 'amount_credited' => $request->amount - $imali_commission, 'comissao' => $imali_commission, 'description' => $request->description, 'is_real_payment' => 0, 'used_points' => $request->used_points, 'estado' => 'success', 'status' => 'success', 'payment_type' => 'directo', 'estado_color' => '#388E3C', 'old_balance' => $accountPayerOld->balance, 'new_balance' => $accountPayer->balance, 'old_store_balance' => $store_account_old->balance, 'new_store_balance' => $store_account->balance, 'category_id' => $store_account->industry_activity, 'transaction_type' => 'credit', 'transaction_name' => 'Depósito', ]); } } else { $new_payment = Payment::create([ 'transaction_id' => $this->trasactionGeneration->generateTransaction(), 'partner_transaction_id' => $request->partner_transaction_id, 'terminalID' => $request->terminal_id, 'sender_id' => $userPayer->id, 'sender_name' => $userPayer->name, 'sender_account_number' => $accountPayer->account_number, 'sender_card_number' => $accountPayer->card_number, 'store_id' => $store_account->id, 'received_points' => $points, 'amount' => $request->amount, 'amount_debited' => $request->amount, 'amount_credited' => $request->amount, 'comissao' => $imali_commission, 'description' => $request->description, 'is_real_payment' => 0, 'used_points' => $request->used_points, 'estado' => 'success', 'status' => 'success', 'payment_type' => 'directo', 'estado_color' => '#388E3C', 'old_balance' => $accountPayerOld->balance, 'new_balance' => $accountPayer->balance, 'old_store_balance' => $store_account_old->balance, 'new_store_balance' => $store_account->balance, 'category_id' => $store_account->industry_activity, 'transaction_type' => 'debit', 'transaction_name' => 'Pagamento', ]); } if ($request->has('sub_account_number') && $sub_account != null) { PrepaidCardDeposit::create([ 'transaction_id' => $this->trasactionGeneration->generateTransaction(), 'payment_transaction_id' => $new_payment->transaction_id, 'imali_account_number' => $accountPayer->account_number, 'imali_sub_account_number' => $sub_account->account_number, 'store_account_number' => $store_account->account_number, 'imali_account_id' => $accountPayer->id, 'imali_sub_account_id' => $sub_account->id, 'store_id' => $store_account->id, 'last_unreal_balance' => $sub_account_old->balance, 'unreal_balance' => $sub_account->balance, 'unreal_amount_credited' => $request->amount, 'real_amount_debited' => $request->amount, 'real_amount_credited' => $request->amount - $imali_commission ]); } $created_payment = $new_payment; } return $created_payment; } // TODO -- 15-Setembro-2024 private function send_payment_notifications($request, $store_contract, $userPayer, $accountPayer, $created_payment) { // notificar o utilizador que fez o pagamento $push_userPayer = new PushNotification( //'Depósito de ' . $request->amount . ' MT', $request->has('sub_account_number') && $request->sub_account_number ? ' Depósito de ' . $request->amount . ' MT' : 'Pagamento de ' . $request->amount . ' MT', // 'Parabéns, ' . $request->has('sub_account_number')?' Fez o depósito de ' . $request->amount . ' MT ' . ' na tua subconta ' . $request->sub_account_number: ' fez o pagamento de ' . $request->amount . ' MT ' . ' na loja ' . $store_contract->name, 'Parabéns, ' . ($request->has('sub_account_number') && $request->sub_account_number ? 'fez o depósito de ' . $request->amount . ' MT na tua subconta ' . $request->sub_account_number : 'fez o pagamento de ' . $request->amount . ' MT na loja ' . $store_contract->name), //'Parabéns, ' . ' fez o pagamento de ' . $request->amount . ' MT ' . ' na loja ' . $store_contract->name, $userPayer->firebase_token, 'com.imali.payapp.payment_PAGAR_NOTIFICATION' ); $push_store = new PushNotification( 'Pagamento ' . $request->amount . ' MT', 'Parabéns, ' . ' recebeu o pagamento de ' . $request->amount . ' MT ' . ' do cliente ' . $userPayer->name, $store_contract->firebase_token, 'mz.co.imali.business.payment_TARGET_NOTIFICATION', 'https://imali.co.mz/wp-content/uploads/2022/04/iMali-Business-Logo.png' ); $data = $this->get_notification_data($request, $userPayer, $store_contract, $created_payment, $accountPayer); // Notificar o user que fez pagamento $push_userPayer->sendPush($data); // Notificar a loja que recebeu o pagamento $this->send_notification_store($store_contract, $push_store, $data, $created_payment); } // TODO -- 15-Setembro-2024 private function get_notification_data($request, $userPayer, $store_contract, $created_payment, $accountPayer) { $category = RamoActivity::find($store_contract->industry_activity); $data = array( 'transaction' => $created_payment->transaction_id, 'loja' => $store_contract->name, 'name' => $userPayer->name, 'loja_account' => $store_contract->account_number, 'pontos' => $created_payment->received_points, 'pontos_usados' => $created_payment->used_points, 'amount' => $created_payment->amount, 'amount_debited' => $created_payment->amount_credited, 'amount_credited' => $created_payment->amount_credited, 'account_number' => $accountPayer->account_number, 'phone' => $userPayer->phone, 'descricao' => $created_payment->description, 'data' => $created_payment->created_at, 'created_at' => $created_payment->created_at, 'estado' => $created_payment->estado, 'comissao' => $created_payment->comissao, 'message_store' => trans('payment_received'), 'message_customer' => trans('payment_done'), 'logo_category' => $category->logo, 'category' => $category->nome, 'route' => 'PAGAR_NOTIFICATION', 'terminal' => 'firebase' ); return $data; } // TODO -- 15-Setembro-2024 private function send_notification_store($store_contract, $push_store, $push_data, $created_payment) { if ($store_contract->notify) { // envia push se estiver activo if ($store_contract->notify_push) { $push_store->sendPush($push_data); } // envia sms se estiver activo if ($store_contract->notify_sms) { $sms = new SendSMSSislog(); $data = array( "sender_id" => $created_payment->sender_id, "store_id" => $created_payment->store_id, "transaction_id" => $created_payment->transaction_id, "created_at" => $created_payment->created_at, "amount" => $created_payment->amount, ); $sms->sendSMSToComerciante($data); } } } public function makePaymentStore(Request $request) { $user = User::find($request->user()->id); if (Hash::check($request->pin, $user->pin)) { $trasactionGeneration = new TransactionGeneration(); $payerUser = User::query()->where('user_id', '=', $request->user()->user_id)->first(); $store = Store::query()->where('account_number', '=', $request->account_number)->first(); $payer_id = $payerUser->id; $imali = ImaliAccount::query()->where('user_id', '=', $payer_id)->first(); $kyc = new Kyc(); $kycCheck = $kyc->checkSenderPayment($request); if ($kycCheck) { $log = new Record(); $log->createLog([ 'description' => $imali->account_number . ' ' . $store->name, 'details' => $kycCheck, 'operation' => 'Payment', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'status' => 'Error', 'user_id' => $request->user()->id ]); return $kycCheck; } else { if ($payerUser) { if ($imali->balance < $request->amount) { $log = new Record(); $log->createLog([ 'description' => $imali->account_number . ' ' . $store->name, 'details' => 'Saldo Insuficiente', 'operation' => 'Payment', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'status' => 'Error', 'user_id' => $request->user()->id ]); return response()->json(['message' => 'Saldo insuficiente', 'class' => 'error'], 402, [], JSON_NUMERIC_CHECK); } else { $valorAPagar = $request->amount; $points = round($valorAPagar); // Payer or Sender Section DB::table('imali_accounts')->where('user_id', $payer_id)->decrement('balance', $valorAPagar); DB::table('imali_accounts')->where('user_id', $payer_id)->increment('points', $points); $contractoComerciante = MerchantContract::query()->where('store_id', '=', $store->id)->first(); $taxaDesconto = $valorAPagar * ($contractoComerciante->taxa) / 100; $valorMin = $contractoComerciante->min_amount; $valorMax = $contractoComerciante->max_amount; if ($taxaDesconto < $valorMin) { $taxaDesconto = $valorMin; } if ($taxaDesconto > $valorMax) { $taxaDesconto = $valorMax; } // $valorFinal = $valorAPagar - $valorAPagar*($contractoComerciante->taxa)/100; $valorFinal = $valorAPagar - $taxaDesconto; // Recever User Merchante DB::table('stores')->where('account_number', $store->account_number)->increment('balance', $valorFinal); // Add Money to Merchant // $storeT = Store::query()->where('account_number', $store->account_number)->first(); // DB::table('merchant_accounts')->where('id', $storeT->merchant_account_id)->increment('balance', $valorFinal); // $profit = $valorAPagar*($contractoComerciante->taxa)/100; $transaction = $trasactionGeneration->generateTransaction(); $createTransaction = Payment::create([ 'transaction_id' => $transaction, 'sender_id' => $payer_id, 'store_id' => $store->id, 'client_id' => $request->user_client_id, 'received_points' => $points, 'amount' => $valorAPagar, 'amount_credited' => $valorFinal, 'comissao' => $taxaDesconto, 'description' => $request->description, 'used_points' => $request->used_points, 'estado' => 'pago', 'payment_type' => 'directo', 'estado_color' => '#388E3C', 'created_at' => now(), 'updated_at' => now(), 'category_id' => $store->industry_activity ]); TransactionHistory::create([ 'user_id' => $request->user()->id, 'payment_id' => $createTransaction->id, 'category_id' => $createTransaction->category_id, 'transaction_type' => 'payment' ]); $actualPoints = $imali->points + $points; $re = $createTransaction->paymentHistoric()->create([ 'sender_account' => $imali->account_number, 'sender_name' => $payerUser->name, 'amount_credited' => $valorFinal, 'status_user' => 'sender', 'status' => 'done', 'comissao' => $taxaDesconto, 'amount' => $valorAPagar, 'user_id' => $payerUser->id, 'actual_points' => $actualPoints, 'last_points' => $imali->points, 'win_points' => $points, 'transaction_id' => $transaction, 'category_id' => $store->industry_activity ]); // TransactionHistory::create([ // 'user_id' => $re->user_id, // 'payment_id' => $re->id, // 'category_id' => $re->category_id, // 'transaction_type' => 'payment' // ]); $saveProfit = $createTransaction->profit()->create([ 'payer_id' => $payer_id, 'payer_account' => $store->account_number, 'amount' => $valorAPagar, 'amount_credited' => $valorFinal, 'comissao' => $taxaDesconto, 'profit_id' => $trasactionGeneration->generateTransaction(), 'payment_id' => $createTransaction->id, 'profit_payer_id' => $createTransaction->store_id ]); if ($saveProfit) { $generate = StoreAmountGeneration::query() ->where('id', '=', $request->store_amount_generation_id) ->first(); if ($generate) { $generate->update([ 'status' => 'sucesso', 'payment_id' => $createTransaction->id ]); $createTransaction->update([ 'store_amount_generation_id' => $generate->id ]); } $log = new Record(); $log->createLog([ 'description' => $imali->account_number . ' ' . $store->name, 'details' => 'Pagamento Feito com Sucesso', 'operation' => 'Payment', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'status' => 'Success', 'user_id' => $request->user()->id ]); $notification = array( // 'icon' => 'ic_imali_logo_verde_01', 'icon' => 'ic_i_mali_cover', 'title' => 'Pagamento ' . $request->amount . ' MT', 'body' => 'Parabéns, ' . ' fez o pagamento de ' . $request->amount . ' MT ' . ' na loja ' . $store->name, 'click_action' => 'com.imali.payapp.payment_PAGAR_NOTIFICATION', // 'color' => '#008577' 'color' => '#ffffff' ); $notificationStore = array( 'icon' => 'ic_imali_logo_verde_01', // 'image' => 'https://paytek-africa.com/image/logo.png', 'image' => 'https://imali.co.mz/wp-content/uploads/2022/04/iMali-Business-Logo.png', // 'icon' => 'ic_i_mali_cover', 'title' => 'Pagamento ' . $request->amount . ' MT', 'body' => 'Parabéns, ' . ' recebeu o pagamento de ' . $request->amount . ' MT ' . ' do cliente ' . $user->name, 'click_action' => 'mz.co.imali.business.payment_TARGET_NOTIFICATION', // 'color' => '#008577' 'color' => '#ffffff' ); $store = Store::query()->where('account_number', $request->account_number)->first(); $category = RamoActivity::find($store->industry_activity); $data = array( 'transaction' => $createTransaction->transaction_id, 'loja' => $store->name, 'name' => $user->name, 'loja_account' => $store->account_number, 'pontos' => $createTransaction->received_points, 'pontos_usados' => $createTransaction->used_points, 'amount' => $createTransaction->amount, 'amount_debited' => $createTransaction->amount_credited, 'amount_credited' => $createTransaction->amount_credited, 'account_number' => $imali->account_number, 'phone' => $request->user()->phone, 'descricao' => $createTransaction->description, 'data' => $createTransaction->created_at, 'created_at' => $createTransaction->created_at, 'estado' => $createTransaction->estado, 'comissao' => $createTransaction->comissao, 'message_store' => 'Pagamento Recebido Com Sucesso', 'message_customer' => 'Pagamento Efectuado Com Sucesso', 'logo_category' => $category->logo, 'category' => $category->nome, 'route' => 'TARGET_NOTIFICATION', 'terminal' => 'firebase' ); // Notifify customer $this->pushNotifification($user->firebase_token, $notification, $data); $storeConfig = StoreConfig::query() ->where('store_id', '=', $store->id) // ->where('store_id', '=', $createTransaction->store_id) ->first(); if ($storeConfig) { if ($storeConfig->notify === 1) { // NOTIFICAR POR SMS if ($storeConfig->notify_sms === 1) { // $sms = new SendSMS(); // $sms->sendMessageToClientePayment($createTransaction); // $sms->sendMessageToComerciante($createTransaction); // $sms->sendMessageToClientePayment($payerUser); $this->smsManager->sendSMSToComerciante($createTransaction); } if ($storeConfig->notify_email == 1) { // Mail::to($store->email)->send(new PagamentoConfirmado($createTransaction)); // Mail::to($payerUser->email)->send(new Pagamento($createTransaction)); } // NOTIFY STORE if ($storeConfig->notify_push == 1) { if ($generate) { $this->pushNotifification($generate->firebase_token, $notificationStore, $data); } else { $device = StoreDevice::query() ->where('store_id', $store->id) ->where('status', '=', 1) ->get(); foreach ($device as $d) { $this->pushNotifification($d->firebase_token, $notificationStore, $data); } } } } } return response()->json([ 'message' => 'Pagamento Efectuado com Sucesso!', 'transaction' => $transaction, 'created_at' => $createTransaction->created_at, 'duration' => 3000 ], 200); } } } } } else { return response()->json(['message' => 'Pin Incorrecto'], 400); } } public function makePaymentStore2NEW(Request $request) { DB::transaction(function ($request) { $trasactionGeneration = new TransactionGeneration(); $payerUser = User::query()->where('user_id', $request->user()->user_id)->first(); $store = Store::query()->where('account_number', $request->account_number)->first(); $payer_id = $payerUser->id; $imali = ImaliAccount::query()->where('user_id', $payer_id)->first(); $kyc = new Kyc(); $kycCheck = $kyc->checkSenderPayment($request); if ($kycCheck) { $log = new Record(); $log->createLog([ 'description' => $imali->account_number . ' ' . $store->name, 'details' => $kycCheck, 'operation' => 'Payment', 'status' => 'Error', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'user_id' => $request->user()->id ]); return $kycCheck; } else { if ($payerUser) { if ($imali->balance < $request->amount) { $log = new Record(); $log->createLog([ 'description' => $imali->account_number . ' ' . $store->name, 'details' => 'Saldo Insuficiente', 'operation' => 'Payment', 'status' => 'Error', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'user_id' => $request->user()->id ]); return response()->json(['message' => 'Saldo insuficiente', 'class' => 'error'], 402, [], JSON_NUMERIC_CHECK); } else { $valorAPagar = $request->amount; $points = round($valorAPagar); // Payer or Sender Section DB::table('imali_accounts')->where('user_id', $payer_id)->decrement('balance', $valorAPagar); DB::table('imali_accounts')->where('user_id', $payer_id)->increment('points', $points); $contractoComerciante = MerchantContract::query()->where('store_id', $store->id)->first(); $taxaDesconto = $valorAPagar * ($contractoComerciante->taxa) / 100; $valorMin = $contractoComerciante->min_amount; $valorMax = $contractoComerciante->max_amount; if ($taxaDesconto < $valorMin) { $taxaDesconto = $valorMin; } if ($taxaDesconto > $valorMax) { $taxaDesconto = $valorMax; } // $valorFinal = $valorAPagar - $valorAPagar*($contractoComerciante->taxa)/100; $valorFinal = $valorAPagar - $taxaDesconto; // Recever User Merchante DB::table('stores')->where('account_number', $store->account_number)->increment('balance', $valorFinal); // $profit = $valorAPagar*($contractoComerciante->taxa)/100; $transaction = $trasactionGeneration->generateTransaction(); $createTransaction = Payment::create([ 'transaction_id' => $transaction, 'sender_id' => $payer_id, 'store_id' => $store->id, 'client_id' => $request->user_client_id, 'received_points' => $points, 'amount' => $valorAPagar, 'amount_credited' => $valorFinal, 'comissao' => $taxaDesconto, 'description' => $request->description, 'used_points' => $request->used_points, 'estado' => 'pago', 'estado_color' => '#388E3C', 'created_at' => now(), 'updated_at' => now(), 'category_id' => $store->industry_activity ]); // TransactionHistory::create([ // 'user_id' => $request->user()->id, // 'payment_id' => $createTransaction->id, // 'category_id' => $createTransaction->category_id, // 'transaction_type' => 'payment' // ]); $actualPoints = $imali->points + $points; $res = $createTransaction->paymentHistoric()->create([ 'sender_account' => $imali->account_number, 'sender_name' => $payerUser->name, 'amount_credited' => $valorFinal, 'status_user' => 'sender', 'status' => 'done', 'comissao' => $taxaDesconto, 'amount' => $valorAPagar, 'user_id' => $payerUser->id, 'actual_points' => $actualPoints, 'last_points' => $imali->points, 'win_points' => $points, 'transaction_id' => $transaction, 'category_id' => $createTransaction->category_id ]); // TransactionHistory::create([ // 'user_id' => $res->user_id, // 'payment_id' => $res->id, // 'category_id' => $res->category_id, // 'transaction_type' => 'payment' // ]); $saveProfit = $createTransaction->profit()->create([ 'payer_id' => $payer_id, 'payer_account' => $store->account_number, 'amount' => $valorAPagar, 'amount_credited' => $valorFinal, 'comissao' => $taxaDesconto, 'profit_id' => $trasactionGeneration->generateTransaction(), 'payment_id' => $createTransaction->id, ]); if ($saveProfit) { $this->smsManager->sendSMSToComerciante($createTransaction); // $sms = new SendSMS(); // $sms->sendMessageToClientePayment($createTransaction); // $sms->sendMessageToComerciante($createTransaction); // $sms->sendMessageToClientePayment($payerUser); // Mail::to($store->email)->send(new PagamentoConfirmado($createTransaction)); // Mail::to($payerUser->email)->send(new Pagamento($createTransaction)); $generate = StoreAmountGeneration::query() ->where('id', $request->store_amount_generation_id) ->first(); if ($generate) { $generate->update([ 'status' => 'sucesso' ]); } $log = new Record(); $log->createLog([ 'description' => $imali->account_number . ' ' . $store->name, 'details' => 'Pagamento Feito com Sucesso', 'operation' => 'Payment', 'status' => 'Success', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'user_id' => $request->user()->id ]); return response()->json([ 'message' => 'Pagamento Feito com Sucesso!', 'transaction' => $transaction, 'created_at' => $createTransaction->created_at, 'duration' => 3000 ], 200); } } } } }); } public function makePaymentStore2(Request $request) { $trasactionGeneration = new TransactionGeneration(); // $payerUser = User::query()->where('user_id', $request->user_id)->first(); $payerUser = User::query()->where('user_id', '=', $request->user()->user_id)->first(); $user = User::find($request->user()->id); // $comerciante = MerchantAccount::query()->where('account_number', $request->account_number)->first(); $store = Store::query()->where('account_number', '=', $request->account_number)->first(); $payer_id = $payerUser->id; $imali = ImaliAccount::query()->where('user_id', $payer_id)->first(); $kyc = new Kyc(); $kycCheck = $kyc->checkSenderPayment($request); if ($kycCheck) { $log = new Record(); $log->createLog([ 'description' => $imali->account_number . ' ' . $store->name, 'details' => $kycCheck, 'operation' => 'Payment', 'status' => 'Error', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'user_id' => $request->user()->id ]); return $kycCheck; } else { if ($payerUser) { if ($imali->balance < $request->amount) { $log = new Record(); $log->createLog([ 'description' => $imali->account_number . ' ' . $store->name, 'details' => 'Saldo Insuficiente', 'operation' => 'Payment', 'status' => 'Error', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'user_id' => $request->user()->id ]); return response()->json(['message' => 'Saldo insuficiente', 'class' => 'error'], 402, [], JSON_NUMERIC_CHECK); } else { $valorAPagar = $request->amount; $points = round($valorAPagar); // Payer or Sender Section DB::table('imali_accounts')->where('user_id', $payer_id)->decrement('balance', $valorAPagar); DB::table('imali_accounts')->where('user_id', $payer_id)->increment('points', $points); $contractoComerciante = MerchantContract::query()->where('store_id', $store->id)->first(); $taxaDesconto = $valorAPagar * ($contractoComerciante->taxa) / 100; $valorMin = $contractoComerciante->min_amount; $valorMax = $contractoComerciante->max_amount; if ($taxaDesconto < $valorMin) { $taxaDesconto = $valorMin; } if ($taxaDesconto > $valorMax) { $taxaDesconto = $valorMax; } // $valorFinal = $valorAPagar - $valorAPagar*($contractoComerciante->taxa)/100; $valorFinal = $valorAPagar - $taxaDesconto; // Recever User Merchante DB::table('stores')->where('account_number', $store->account_number)->increment('balance', $valorFinal); // Add Money to Merchant // $storeT = Store::query()->where('account_number', $store->account_number)->first(); // DB::table('merchant_accounts')->where('id', $storeT->merchant_account_id)->increment('balance', $valorFinal); // $profit = $valorAPagar*($contractoComerciante->taxa)/100; $transaction = $trasactionGeneration->generateTransaction(); $createTransaction = Payment::create([ 'transaction_id' => $transaction, 'sender_id' => $payer_id, 'store_id' => $store->id, 'client_id' => $request->user_client_id, 'received_points' => $points, 'amount' => $valorAPagar, 'amount_credited' => $valorFinal, 'comissao' => $taxaDesconto, 'description' => $request->description, 'used_points' => $request->used_points, 'estado' => 'pago', 'estado_color' => '#388E3C', 'payment_type' => 'directo', 'created_at' => now(), 'updated_at' => now(), 'category_id' => $store->industry_activity ]); TransactionHistory::create([ 'user_id' => $request->user()->id, 'payment_id' => $createTransaction->id, 'category_id' => $createTransaction->category_id, 'transaction_type' => 'payment' ]); $actualPoints = $imali->points + $points; $res = $createTransaction->paymentHistoric()->create([ 'sender_account' => $imali->account_number, 'sender_name' => $payerUser->name, 'amount_credited' => $valorFinal, 'status_user' => 'sender', 'status' => 'done', 'comissao' => $taxaDesconto, 'amount' => $valorAPagar, 'user_id' => $payerUser->id, 'actual_points' => $actualPoints, 'last_points' => $imali->points, 'win_points' => $points, 'transaction_id' => $transaction, 'category_id' => $createTransaction->category_id ]); TransactionHistory::create([ 'user_id' => $res->user_id, 'payment_id' => $res->id, 'category_id' => $res->category_id, 'transaction_type' => 'payment' ]); $saveProfit = $createTransaction->profit()->create([ 'payer_id' => $payer_id, 'payer_account' => $store->account_number, 'amount' => $valorAPagar, 'amount_credited' => $valorFinal, 'comissao' => $taxaDesconto, 'profit_id' => $trasactionGeneration->generateTransaction(), 'payment_id' => $createTransaction->id, ]); if ($saveProfit) { // $sms = new SendSMSSislog(); // $sms->sendSMSToComerciante($createTransaction); // $sms = new SendSMS(); // $sms->sendMessageToClientePayment($createTransaction); // $sms->sendMessageToComerciante($createTransaction); // $sms->sendMessageToClientePayment($payerUser); // Mail::to($store->email)->send(new PagamentoConfirmado($createTransaction)); // Mail::to($payerUser->email)->send(new Pagamento($createTransaction)); $generate = StoreAmountGeneration::query() ->where('id', $request->store_amount_generation_id) ->first(); if ($generate) { $generate->update([ 'status' => 'sucesso', 'payment_id' => $createTransaction->id ]); $createTransaction->update([ 'store_amount_generation_id' => $generate->id ]); } $log = new Record(); $log->createLog([ 'description' => $imali->account_number . ' ' . $store->name, 'details' => 'Pagamento Feito com Sucesso', 'operation' => 'Payment', 'status' => 'Success', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'user_id' => $request->user()->id ]); $notification = array( // 'icon' => 'ic_imali_logo_verde_01', 'icon' => 'ic_i_mali_cover', // 'icon' => 'ic_i_mali_cover', 'title' => 'Pagamento ' . $request->amount . ' MT', 'body' => 'Parabéns, ' . ' fez o pagamento de ' . $request->amount . ' MT ' . ' na loja ' . $store->name, 'click_action' => 'com.imali.payapp.payment_PAGAR_NOTIFICATION', // 'color' => '#008577' 'color' => '#ffffff' ); $notificationStore = array( 'icon' => 'ic_imali_logo_verde_01', // 'icon' => 'ic_i_mali_cover', 'title' => 'Pagamento ' . $request->amount . ' MT', // 'image' => 'https://paytek-africa.com/image/logo.png', 'image' => 'https://imali.co.mz/wp-content/uploads/2022/04/iMali-Business-Logo.png', 'body' => 'Parabéns, ' . ' recebeu o pagamento de ' . $request->amount . ' MT ' . ' do cliente ' . $user->name, 'click_action' => 'mz.co.imali.business.payment_TARGET_NOTIFICATION', // 'color' => '#008577' 'color' => '#ffffff' ); $store = Store::query()->where('account_number', $request->account_number)->first(); $category = RamoActivity::find($store->industry_activity); $data = array( 'transaction' => $createTransaction->transaction_id, 'loja' => $store->name, 'name' => $user->name, 'loja_account' => $store->account_number, 'pontos' => $createTransaction->received_points, 'pontos_usados' => $createTransaction->used_points, 'amount' => $createTransaction->amount, 'amount_debited' => $createTransaction->amount_credited, 'amount_credited' => $createTransaction->amount_credited, 'account_number' => $imali->account_number, 'phone' => $request->user()->phone, 'descricao' => $createTransaction->description, 'data' => $createTransaction->created_at, 'created_at' => $createTransaction->created_at, 'estado' => $createTransaction->estado, 'comissao' => $createTransaction->comissao, 'message_store' => 'Pagamento Recebido Com Sucesso', 'message_customer' => 'Pagamento Efectuado Com Sucesso', 'logo_category' => $category->logo, 'category' => $category->nome, 'route' => 'TRANSFER_DETAILS', 'terminal' => 'firebase' ); // $this->pushNotifification($user->firebase_token, $notification, $data); // // if ($generate) { // $this->pushNotifification($generate->firebase_token, $notificationStore, $data); // } // // $device = StoreDevice::query() // ->where('store_id', $store->id) // ->where('status', '=', 1) // ->get(); // // foreach ($device as $d) { // $this->pushNotifification($d->firebase_token, $notificationStore, $data); // } // NOTIFY CUSTOMER $this->pushNotifification($user->firebase_token, $notification, $data); $storeConfig = StoreConfig::query() ->where('store_id', '=', $store->id) ->first(); if ($storeConfig) { if ($storeConfig->notify == 1) { // NOTIFICAR POR SMS if ($storeConfig->notify_sms == 1) { // $sms = new SendSMS(); // $sms->sendMessageToClientePayment($createTransaction); // $sms->sendMessageToComerciante($createTransaction); // $sms->sendMessageToClientePayment($payerUser); $this->smsManager->sendSMSToComerciante($createTransaction); } if ($storeConfig->notify_email == 1) { // Mail::to($store->email)->send(new PagamentoConfirmado($createTransaction)); // Mail::to($payerUser->email)->send(new Pagamento($createTransaction)); } if ($storeConfig->notify_push == 1) { if ($generate) { $this->pushNotifification($generate->firebase_token, $notificationStore, $data); } else { $device = StoreDevice::query() ->where('store_id', $store->id) ->where('status', '=', 1) ->get(); foreach ($device as $d) { $this->pushNotifification($d->firebase_token, $notificationStore, $data); } } } } } return response()->json([ 'message' => 'Pagamento Feito com Sucesso!', 'transaction' => $transaction, 'created_at' => $createTransaction->created_at, 'duration' => 3000 ], 200); } } } } } public function transferMoney(Request $request) { $usr = User::query()->join('imali_accounts', 'imali_accounts.user_id', 'users.id')->where('imali_accounts.account_number', $request->account_number)->first(); //? teste $kyc = new Kyc(); $request->request->add(['id' => $request->user()->id, 'receiver_id' => $usr->id]); $resultKYC = $kyc->checkSender($request); //? teste if (Hash::check($request->pin, auth()->user()->pin)) { $random = new TransactionGeneration(); $senderUser = User::query()->where('user_id', $request->user()->user_id)->first(); $sender_id = $senderUser->id; $imaliAccountSender = ImaliAccount::query()->where('user_id', $senderUser->id)->first(); $imaliAccountReceiver = ImaliAccount::query()->where('account_number', $request->account_number)->first(); $imaliAccountReceiverCount = ImaliAccount::query()->where('account_number', $request->account_number)->count(); $kyc = ImaliAccount::query() ->join('imali_account_configs', 'imali_account_configs.id', '=', 'imali_accounts.imali_account_config') ->where('user_id', $senderUser->id) ->select('imali_account_configs.*') ->first(); $payments = Payment::query() ->where(['sender_id' => $senderUser->id]) ->whereDate('created_at', date('Y-m-d')) ->get(); // $recevier = User::query()->where('id', $imaliAccountReceiver->user_id)->count(); if ($imaliAccountReceiverCount > 0) { $recevier = User::query()->where('id', $imaliAccountReceiver->user_id)->first(); // $kyc = new Kyc(); $request->request->add(['id' => $senderUser->id, 'receiver_id' => $recevier->id]); // return response()->json(['message' => 'Não pode Transferir para si mesmo!', 'class' => 'error'], 400); // $result = $kyc->checkSender($request); // $result = $kyc->checkSender($request); $result = $resultKYC; if ($result) { $log = new Record(); $log->createLog([ 'description' => 'Transfer Money', 'details' => $result, 'operation' => 'Transfer Money', 'status' => 'Error', 'origin_ip' => $request->ip(), 'properties' => json_encode($request->except(['pin'])), // 'properties' => json_encode($request->all()), 'origin_request' => $request->url(), 'user_id' => $request->user()->id ]); return $result; } else { if ($imaliAccountSender) { if ($imaliAccountReceiver->user_id === $imaliAccountSender->user_id) { // $log = new Record(); // $log->createLog([ // 'description' => $imaliAccountSender->account_number, // 'details' => 'Não pode Transferir para Si mesmo' . ' ReceiverAccount: ' . $imaliAccountReceiver->account_number, // 'operation' => 'Transfer Money', // 'status' => 'Error', // 'user_id' => $request->user()->id // ]); $log = new Record(); $log->createLog([ 'description' => 'Não pode Transferir para Si mesmo', 'details' => 'Não pode Transferir para Si mesmo', 'operation' => 'Transfer Money', 'properties' => json_encode($request->except(['pin'])), 'status' => 'Error', 'origin_ip' => $request->ip(), 'origin_request' => $request->url(), 'user_id' => $request->user()->id ]); return response()->json(['message' => 'Não pode Transferir para si mesmo!', 'class' => 'error'], 400); } elseif ($imaliAccountSender->balance < $request->amount) { $log = new Record(); $log->createLog([ 'description' => 'Saldo insuficiente', 'details' => 'Saldo Insuficiente', 'operation' => 'Transfer Money', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'status' => 'Error', 'origin_ip' => $request->ip(), 'origin_request' => $request->url(), 'user_id' => $request->user()->id ]); return response()->json(['message' => 'Saldo insuficiente', 'class' => 'error'], 402); } else { $valorAPagar = $request->amount; $points = round($valorAPagar); $imaliAccountConfig = ImaliAccountConfig::find(1); // $valorTaxadoTotal = $valorAPagar + $valorAPagar*($imaliAccountConfig->taxa)/100; $valorTaxadoTotal = $valorAPagar + $imaliAccountConfig->taxa; // Payer or Sender Section DB::table('imali_accounts')->where('user_id', $sender_id)->decrement('balance', $valorTaxadoTotal); // Recever User DB::table('imali_accounts')->where('account_number', $imaliAccountReceiver->account_number)->increment('balance', $valorAPagar); // $profit = $valorAPagar*$valorAPagar*($imaliAccountConfig->taxa)/100; $profit = $imaliAccountConfig->taxa; $transactionReference = $random->generateTransaction(); $imaliAccountSender2 = ImaliAccount::query()->where('user_id', $senderUser->id)->first(); $transferencia = Transfer::create([ 'transaction_id' => $transactionReference, 'sender_id' => $sender_id, 'reciever_id' => $recevier->id, 'reciever_name' => $recevier->name, 'reciever_account' => $imaliAccountReceiver->account_number, 'amount' => $valorAPagar, 'description' => $request->description, 'comissao' => $profit, 'estado_color' => '#388E3C', 'estado' => 'Pago', 'amount_debited' => $valorTaxadoTotal, 'created_at' => now(), 'updated_at' => now(), 'category_id' => 22, 'old_balance' => $imaliAccountSender->balance, 'new_balance' => $imaliAccountSender2->balance ]); TransactionHistory::create([ 'user_id' => $transferencia->sender_id, 'transfer_id' => $transferencia->id, 'category_id' => $transferencia->category_id, 'transaction_type' => 'transfer' ]); $senderHistory = TransferHistory::create([ 'transaction_id' => $transactionReference, 'user_id' => $senderUser->id, // 'account_number' =>$imaliAccountReceiver->account_number, 'client_id' => $recevier->id, 'amount' => $valorAPagar, 'description' => $request->description, 'comissao' => $profit, 'estado_color' => '#388E3C', 'estado' => 'Pago', 'user_status' => 'payer', 'amount_debited' => $valorTaxadoTotal, 'created_at' => now(), 'updated_at' => now(), 'category_id' => $transferencia->category_id ]); TransactionHistory::create([ 'user_id' => $senderHistory->user_id, 'transfer_history_id' => $senderHistory->id, 'category_id' => $senderHistory->category_id, 'transaction_type' => 'transfer_history' ]); $receiverHistory = TransferHistory::create([ 'transaction_id' => $transactionReference, 'user_id' => $recevier->id, // 'account_number' =>$imaliAccountSender->account_number, 'client_id' => $senderUser->id, 'amount' => $valorAPagar, 'description' => $request->description, 'comissao' => 0, 'estado_color' => '#388E3C', 'estado' => 'Recebido', 'user_status' => 'receiver', 'amount_debited' => 0, 'created_at' => now(), 'updated_at' => now(), 'category_id' => $transferencia->category_id ]); TransactionHistory::create([ 'user_id' => $receiverHistory->user_id, 'transfer_history_id' => $receiverHistory->id, 'category_id' => $receiverHistory->category_id, 'transaction_type' => 'transfer_history' ]); // $transferencia->paymentHistoric()->create([ // 'sender_account' =>$imaliAccountSender->account_number, // 'sender_name' => $senderUser->name, // 'amount_credited' => $valorTaxadoTotal, // 'status_user' => 'reciever', // 'status' => 'done', // 'comissao' => $profit, // 'amount' =>$valorAPagar, // 'sender_id' => $senderUser->id, // 'user_id' => $recevier->id, // 'actual_points' =>$recevier->points, // 'last_points' =>$recevier->points, // 'win_points' => 0, // 'transaction_id' =>$transferencia->transaction_id // ]); $saveProfit = $transferencia->profit()->create([ 'payer_id' => $senderUser->id, 'payer_account' => $imaliAccountSender->account_number, 'amount' => $valorAPagar, 'amount_credited' => $valorTaxadoTotal, 'comissao' => $profit, 'profit_id' => $transactionReference, 'payment_id' => $transferencia->id, 'transfer_id' => $request->user()->id ]); // $sms = new SendSMS(); // $sms->sendSMSTransferSender($transferencia); // $sms->sendSMSTranferReceiver($transferencia); $recevier2 = User::query()->where('id', $imaliAccountReceiver->user_id)->first(); $notification = array( // 'icon' => 'ic_i_mali_cover', 'icon' => 'ic_imali_logo_verde_01', 'title' => 'Recebeste ' . $request->amount . ' MT', 'body' => 'Parabéns, ' . 'recebeste ' . $request->amount . 'MT ' . 'do ' . $request->user()->name, 'click_action' => 'com.imali.payapp.payment_TRANSFER_DETAILS', // 'color' => '#008577' 'color' => '#ffffff' ); $data = array( 'transaction' => $receiverHistory->transaction_id, 'name' => $request->user()->name, 'amount' => (float)$senderHistory->amount, 'amount_debited' => (float)$receiverHistory->amount_debited, // 'amount_credited' => (double)$receiverHistory->amount_credited, 'account_number' => (int)$imaliAccountSender->account_number, 'phone' => $request->user()->phone, 'description' => $request->description, 'data' => $receiverHistory->created_at, 'estado' => $receiverHistory->estado, 'route' => 'TRANSFER_DETAILS', 'comissao' => (float)$receiverHistory->comissao, 'terminal' => 'firebase' ); $this->pushNotifification($recevier2->firebase_token, $notification, $data); if ($request->id_request != 0) { $moneyR = MoneyRequest::query()->where('id', $request->id_request)->first(); if ($moneyR) { $moneyR->update([ 'status' => 'sucesso' ]); } } if ($saveProfit) { $log = new Record(); $log->createLog([ 'description' => 'SenderAccount: ' . $imaliAccountSender->account_number . ' ReceiverAccount: ' . $imaliAccountReceiver->account_number, 'details' => 'Transferência feita com Sucesso', 'operation' => 'Transfer Money', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'status' => 'Success', 'origin_ip' => $request->ip(), 'origin_request' => $request->url(), 'user_id' => $request->user()->id ]); return response()->json([ 'message' => 'Transferência Feita com Sucesso!', 'transaction' => $transactionReference, 'created_at' => $transferencia->created_at ], 200); } } } } } else { $log = new Record(); $log->createLog([ 'description' => 'SenderAccount: ' . $imaliAccountSender->account_number . ' ReceiverAccount: ' . $imaliAccountReceiver->account_number, 'details' => 'Conta i.Mali inválida', 'operation' => 'Transfer Money', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'status' => 'Error', 'origin_ip' => $request->ip(), 'origin_request' => $request->url(), 'user_id' => $request->user()->id ]); return response()->json(['message' => 'Conta i.Mali inválida', 'class' => 'error'], 404); } } else { return response()->json(['message' => 'Pin Incorrecto'], 400); } } // todo new Method transfer 17-April-2024 * public function transferMoneyNew2024ORIGINALISSIMO(Request $request) { // return $request->all(); // $app = new GenerateImaliAccount(); // return $app->generateSubImaliAccount(); Log::info('Incoming Transfer with PIN', [ 'content' => $request->all(), ]); // $val_resp = $this->makeValidations($request); $this->validate($request, [ 'account_number' => 'required', 'amount' => 'required', //'imali_transac_type' => 'required' ]); // todo MIGUEL deve implementar esse campo ao fazer-se a transferencia na proxima versao $request->request->add(['imali_transac_type' => 'TRANSAC_C2C_TRANSFERENCIA']); // $userReceiver = User::getUserDetails(User::getAccount($request->account_number)->user_id); $accountReceiver = User::getAccount($request->account_number); $accountReceiverOld = User::getAccount($request->account_number); $userReceiver = User::getUserDetails($accountReceiver->user_id); //! novo metodo substituido // todo -- Identificar se a conta que vai receber é conta BUSINESS... 🍩 if ($request->has('id_request') && $request->id_request && ($request->id_request !== 'request_id')) { $pedido = MoneyRequest::query()->where('id', $request->id_request)->first(); $userReceiver = User::getUserDetails($pedido->user_id); //! novo metodo substituido if (!$pedido) return response()->json(['message' => 'Pedido invalido!'], 400); // if ($pedido->user_id == auth()->user()->id) return response()->json(['message' => 'Nao pode aceitar um pedido feito por ti mesmo!'], 400); if ($pedido->status === 'sucesso') return response()->json(['message' => 'Esse pedido ja foi aceite.'], 400); } $tariff = ImaliTariff::query()->where('abbreviation', $request->imali_transac_type)->first(); if (!$tariff) return response()->json(['message' => 'Codigo de transacao invalida.'], 400); //! -------- // Buscar dados do User que faz a transacao // return $request->user(); // return $totalKeys = count($request->user()->getAttributes()); if ($request->has('complete_debit') && $request->complete_debit == 'COMPLETE_DEBIT') { $userSender = User::getUserDetails($request->user()->user_id); } else { $userSender = User::getUserAccount(); // todo -- Identificar se a conta que vai enviar é conta CLIENTE... 🍩 } // Buscar dados da conta do User que faz a transacao $accountSender = User::getAccountByUser($userSender->id, $userSender->account_id); $accountSenderOld = User::getAccountByUser($userSender->id, $userSender->account_id); //? Se o user que esta a transferir for CLIENTE para BUSINESS ❌ if ($userSender->profile == 'client' && $userReceiver->profile == 'business') return SendResponse::errorResp404notfound('Transação não autorizada', 'Unauthorized transaction'); //? Se o user que esta a transferir for CLIENTE para BUSINESS ❌ $kyc = new UserKyc($userSender); $kycSenderResp = $kyc->checkSenderKYC($request->amount); if ($kycSenderResp->getStatusCode() != 200) return $kycSenderResp; // verificacao do KYC e Saldo de Origem $kycSenderResp = $kyc->checkUserBalance($request->amount); if ($kycSenderResp->getStatusCode() != 200) return $kycSenderResp; // Validar o PIN e Fingerprint do userPayer $auth = new ClassesAuth(); $authResp = $auth->checkUserPinAndFingerprint($request); if ($authResp->getStatusCode() != 200) return $authResp; if ($request->has('wallets_id')) { return $this->createWithDrawalls2024($request, $userSender, $accountSender, $accountSenderOld); } // return $accountReceiver; // verificacao do KYC e Saldo de Destino $kyc = new UserKyc($userReceiver); $kycReceiverResp = $kyc->checkReceiverKYC($request->amount); if ($kycReceiverResp->getStatusCode() != 200) return $kycReceiverResp; // Validar o PIN e Fingerprint do userPayer $auth = new ClassesAuth(); $authResp = $auth->checkUserPinAndFingerprint($request); if ($authResp->getStatusCode() != 200) return $authResp; //! -------- // validar se esta a ser envido o valor para si mesmo if ($accountSender->id == $accountReceiver->id) return response()->json(['message' => 'Não podes enviar dinheiro para ti mesmo.'], 400); // realizacao de debito na conta de origem e credito na conta de destino try { DB::beginTransaction(); $total_amount = ImaliTariff::getImaliTotalAmount($request->amount, $userReceiver->profile, $tariff->fee_type, $tariff->fee); $incoming_value = ImaliTariff::getImalIncoming($request->amount, $userReceiver->profile, $tariff->fee_type, $tariff->fee); // retirada do valor da conta de quem envia $accountSender->balance -= $total_amount; $accountSender->update(); // creditar valor da conta de quem recebe $accountReceiver->balance += $request->amount; $accountReceiver->update(); // Registar a transacao de transferencia | Envio de Dinheiro $random = new TransactionGeneration(); $transactionReference = $random->generateTransaction(); $transferencia = Transfer::create([ 'transaction_id' => $transactionReference, 'sender_id' => $userSender->id, 'sender_account' => $accountSender->account_number, 'sender_name' => $userSender->name, 'sender_account_type' => $userSender->profile, 'reciever_id' => $userReceiver->id, 'reciever_account' => $accountReceiver->account_number, 'reciever_name' => $userReceiver->name, 'amount' => $request->amount, 'imali_fee' => 0, 'imali_cost' => 0, // 'description' => 'TRF. iMali', 'description' => 'TRF. iMali de ' . $userSender->name . ' para ' . $userReceiver->name, 'estado' => 'Pago', 'status' => 'success', 'old_balance' => $accountSenderOld->balance, 'new_balance' => $accountSender->balance, 'total_amount' => $total_amount, 'commission' => $incoming_value, 'comissao' => $incoming_value, 'stamp_tax' => 0, 'amount_debited' => $total_amount, 'imali_transac_type' => $tariff->abbreviation ]); $senderHistory = TransferHistory::create([ 'transaction_id' => $transactionReference, 'sender_account' => $userSender->account_number, 'reciever_account' => $userReceiver->account_number, 'user_id' => $userSender->id, 'client_id' => $userReceiver->id, 'amount' => $request->amount, 'comissao' => $incoming_value, 'estado_color' => '#388E3C', 'estado' => 'Pago', 'user_status' => 'payer', 'amount_debited' => $total_amount, 'transaction_type' => 'debit', 'transaction_name' => 'Transferência' ]); $receiverHistory = TransferHistory::create([ 'transaction_id' => $transactionReference, 'sender_account' => $userReceiver->account_number, 'reciever_account' => $userSender->account_number, 'user_id' => $userReceiver->id, 'client_id' => $userSender->id, 'amount' => $request->amount, 'description' => $request->description, 'comissao' => $incoming_value, 'estado_color' => '#388E3C', 'estado' => 'Recebido', 'user_status' => 'receiver', 'amount_debited' => $total_amount, 'transaction_type' => 'credit', 'transaction_name' => 'Transferência' ]); TransactionHistory::create([ 'user_id' => $senderHistory->user_id, 'transfer_history_id' => $senderHistory->id, 'transaction_type' => 'transfer_history' ]); TransactionHistory::create([ 'user_id' => $receiverHistory->user_id, 'transfer_history_id' => $receiverHistory->id, 'transaction_type' => 'transfer' ]); // $bug=2/0; // DADOS DA TABELA ALLTRANSACTIONS // REGISTO DE DEBITO PARA O SENDER AllTransactionController::create_all_transaction( $transferencia->transaction_id, 2, 1, $userSender->name, $userSender->account_number, 1, $userReceiver->name, $userReceiver->account_number, 1, $transferencia->amount, 'Transferencia iMali', $accountSenderOld->balance, $accountSender->balance, $accountReceiverOld->balance, $accountReceiver->balance, $transferencia->status, $transferencia->created_at, 'DEBIT', ); // REGISTO DE DEBITO PARA O RECEIVER AllTransactionController::create_all_transaction( $transferencia->transaction_id, 2, 1, $userSender->name, $userSender->account_number, 1, $userReceiver->name, $userReceiver->account_number, 1, $transferencia->amount, 'Transferencia iMali', $accountSenderOld->balance, $accountSender->balance, $accountReceiverOld->balance, $accountReceiver->balance, $transferencia->status, $transferencia->created_at, 'CREDIT', ); // DADOS DA TABELA ALLTRANSACTIONS $notification = array( 'icon' => 'ic_imali_logo_verde_01', 'title' => 'Recebeste ' . $request->amount . ' MT', 'body' => 'Parabéns, ' . 'recebeste ' . $request->amount . 'MT ' . 'do ' . $request->user()->name, 'click_action' => 'com.imali.payapp.payment_TRANSFER_DETAILS', 'color' => '#ffffff' ); $data = array( 'transaction' => $receiverHistory->transaction_id, 'name' => $request->user()->name, 'amount' => (float)$senderHistory->amount, 'amount_debited' => (float)$receiverHistory->amount_debited, 'account_number' => (int)$accountSender->account_number, 'phone' => $request->user()->phone, 'description' => $request->description, 'data' => $receiverHistory->created_at, 'estado' => $receiverHistory->estado, 'route' => 'TRANSFER_DETAILS', 'comissao' => (float)$receiverHistory->comissao, 'terminal' => 'firebase' ); if ($request->id_request != 0) { $moneyR = MoneyRequest::query()->where('id', $request->id_request)->first(); if ($moneyR) { $moneyR->update([ 'status' => 'sucesso', 'new_balance' => $accountReceiver->balance ]); } } $this->pushNotifification($userReceiver->firebase_token, $notification, $data); // $push_userPayer->sendPush($data); DB::commit(); return response()->json([ 'message' => 'Transferência Feita com Sucesso!', 'transaction' => $transactionReference, 'created_at' => $transferencia->created_at ], 200); } catch (\Throwable $th) { DB::rollBack(); // return response()->json(['message' => 'Erro do Servidor!', $th->getMessage()], 500); Log::info('Error TransferMoneyNEW2024', [ 'content' => $request->url(), 'params' => $request->all(), 'error' => $th, ]); return response()->json(['message' => 'Erro do Servidor!'], 500); } } public function accept_loans(Request $request) { $accept = BusinessAccount::query() ->where('accept_loans', 1) ->select( 'id', 'company_name as name', 'account_number', 'owner_name', 'owner_phone', 'owner_email', 'business_type', 'accept_loans' ) ->orderBy('id', 'desc') // ->get(); ->first(); return response()->json([ 'data' => [$accept] ], 200); } public function pay_loans_payments(Request $request) { $transfers = Transfer::query() ->where('credit_request_ref', $request->credit_request) ->orderBy('created_at', 'desc') ->get(); return response()->json([ 'data' => $transfers ], 200); } // todo NEW 07-11-2025 public function pay_loans(Request $request) { try { $this->validate($request, [ 'credit_request' => 'required', 'payment_type' => 'required|in:TOTAL,PARTIAL', 'amount' => 'required_if:payment_type,PARTIAL', ]); $credit = \App\BusinessCreditRequest::query() ->join('begin_solicitations', 'begin_solicitations.id', 'business_credit_requests.dados_begin_solicitation') ->where('business_credit_requests.transaction_id', $request->credit_request) ->where('business_credit_requests.status', 'IN_PROGRESS') ->select('business_credit_requests.*', 'begin_solicitations.*') ->first(); // return $credit; if (!$credit) { return response()->json([ 'message' => 'Esta conta não tem empréstimo em andamento.' ], 404); } if ($request->payment_type === 'PARTIAL') { $request->request->add(['account_number' => $credit->provider_account]); } elseif ($request->payment_type === 'TOTAL') { $begin_solicitation_data = BeginSolicitation::find($credit->dados_begin_solicitation); // $request_account = User::getAccount($credit->request_account); $request->request->add(['account_number' => $credit->provider_account, 'amount' => $begin_solicitation_data->remaing_amount]); } $resp_transfer = $this->transferMoneyNew2024($request); if ($resp_transfer->getStatusCode() == 200) { $begin_solicitation = BeginSolicitation::find($credit->dados_begin_solicitation); $begin_solicitation->remaing_amount -= $request->amount; $begin_solicitation->paid_amount += $request->amount; $begin_solicitation->update(); $begin_solicitation2 = BeginSolicitation::find($credit->dados_begin_solicitation); if ($begin_solicitation2 && $begin_solicitation2->remaing_amount == 0) { $credit2 = \App\BusinessCreditRequest::query() ->where('transaction_id', $request->credit_request) ->where('status', 'IN_PROGRESS') ->first(); $credit2->status = 'PAID'; $credit2->update(); } } return $resp_transfer; } catch (\Throwable $th) { return response()->json([ 'message' => 'Erro interno ao processar pagamento de empréstimo.', 'error_hint' => $th->getMessage() ], 500); } } public function transferMoneyNew2024(Request $request) { // return $request->all(); // $app = new GenerateImaliAccount(); // return $app->generateSubImaliAccount(); Log::info('Incoming Transfer with PIN', [ 'content' => $request->all(), ]); // $val_resp = $this->makeValidations($request); $this->validate($request, [ 'account_number' => 'required', 'amount' => 'required', //'imali_transac_type' => 'required' ]); // return "Passou"; // todo MIGUEL deve implementar esse campo ao fazer-se a transferencia na proxima versao $request->request->add(['imali_transac_type' => 'TRANSAC_C2C_TRANSFERENCIA']); // $userReceiver = User::getUserDetails(User::getAccount($request->account_number)->user_id); $accountReceiver = User::getAccount($request->account_number); $accountReceiverOld = User::getAccount($request->account_number); $userReceiver = User::getUserDetails($accountReceiver->user_id); //! novo metodo substituido // todo -- Identificar se a conta que vai receber é conta BUSINESS... 🍩 if ($request->has('id_request') && $request->id_request && ($request->id_request !== 'request_id')) { $pedido = MoneyRequest::query()->where('id', $request->id_request)->first(); $userReceiver = User::getUserDetails($pedido->user_id); //! novo metodo substituido if (!$pedido) return response()->json(['message' => 'Pedido invalido!'], 400); // if ($pedido->user_id == auth()->user()->id) return response()->json(['message' => 'Nao pode aceitar um pedido feito por ti mesmo!'], 400); if ($pedido->status === 'sucesso') return response()->json(['message' => 'Esse pedido ja foi aceite.'], 400); } $tariff = ImaliTariff::query()->where('abbreviation', $request->imali_transac_type)->first(); if (!$tariff) return response()->json(['message' => 'Codigo de transacao invalida.'], 400); //! -------- // Buscar dados do User que faz a transacao // return $request->user(); // return $totalKeys = count($request->user()->getAttributes()); if ($request->has('complete_debit') && $request->complete_debit == 'COMPLETE_DEBIT') { $userSender = User::getUserDetails($request->user()->user_id); } else { $userSender = User::getUserAccount(); // todo -- Identificar se a conta que vai enviar é conta CLIENTE... 🍩 } // Buscar dados da conta do User que faz a transacao $accountSender = User::getAccountByUser($userSender->id, $userSender->account_id); $accountSenderOld = User::getAccountByUser($userSender->id, $userSender->account_id); //? Se o user que esta a transferir for CLIENTE para BUSINESS ❌ if ($userSender->profile == 'client' && $userReceiver->profile == 'business') return SendResponse::errorResp404notfound('Transação não autorizada', 'Unauthorized transaction'); //? Se o user que esta a transferir for CLIENTE para BUSINESS ❌ $kyc = new UserKyc($userSender); $kycSenderResp = $kyc->checkSenderKYC($request->amount); if ($kycSenderResp->getStatusCode() != 200) return $kycSenderResp; // verificacao do KYC e Saldo de Origem $kycSenderResp = $kyc->checkUserBalance($request->amount); if ($kycSenderResp->getStatusCode() != 200) return $kycSenderResp; // Validar o PIN e Fingerprint do userPayer $auth = new ClassesAuth(); $authResp = $auth->checkUserPinAndFingerprint($request); if ($authResp->getStatusCode() != 200) return $authResp; if ($request->has('wallets_id')) { return $this->createWithDrawalls2024($request, $userSender, $accountSender, $accountSenderOld); } // return $accountReceiver; // verificacao do KYC e Saldo de Destino $kyc = new UserKyc($userReceiver); $kycReceiverResp = $kyc->checkReceiverKYC($request->amount); if ($kycReceiverResp->getStatusCode() != 200) return $kycReceiverResp; // Validar o PIN e Fingerprint do userPayer $auth = new ClassesAuth(); $authResp = $auth->checkUserPinAndFingerprint($request); if ($authResp->getStatusCode() != 200) return $authResp; //! -------- // validar se esta a ser envido o valor para si mesmo if ($accountSender->id == $accountReceiver->id) return response()->json(['message' => 'Não podes enviar dinheiro para ti mesmo.'], 400); // realizacao de debito na conta de origem e credito na conta de destino try { DB::beginTransaction(); // return $total_amount; // return $request->all(); $total_amount = ImaliTariff::getImaliTotalAmount($request->amount, $userReceiver->profile, $tariff->fee_type, $tariff->fee); $incoming_value = ImaliTariff::getImalIncoming($request->amount, $userReceiver->profile, $tariff->fee_type, $tariff->fee); // retirada do valor da conta de quem envia $accountSender->balance -= $total_amount; $accountSender->update(); // creditar valor da conta de quem recebe $accountReceiver->balance += $request->amount; $accountReceiver->update(); // Registar a transacao de transferencia | Envio de Dinheiro $random = new TransactionGeneration(); $transactionReference = $random->generateTransaction(); $transferencia = Transfer::create([ 'transaction_id' => $transactionReference, 'sender_id' => $userSender->id, 'sender_account' => $accountSender->account_number, 'sender_name' => $userSender->name, 'sender_account_type' => $userSender->profile, 'reciever_id' => $userReceiver->id, 'reciever_account' => $accountReceiver->account_number, 'reciever_name' => $userReceiver->name, 'amount' => $request->amount, 'imali_fee' => 0, 'imali_cost' => 0, // 'description' => 'TRF. iMali', 'description' => 'TRF. iMali de ' . $userSender->name . ' para ' . $userReceiver->name, 'estado' => 'Pago', 'status' => 'success', 'old_balance' => $accountSenderOld->balance, 'new_balance' => $accountSender->balance, 'total_amount' => $total_amount, 'commission' => $incoming_value, 'comissao' => $incoming_value, 'stamp_tax' => 0, 'amount_debited' => $total_amount, 'imali_transac_type' => $tariff->abbreviation ]); $senderHistory = TransferHistory::create([ 'transaction_id' => $transactionReference, 'sender_account' => $userSender->account_number, 'reciever_account' => $userReceiver->account_number, 'user_id' => $userSender->id, 'client_id' => $userReceiver->id, 'amount' => $request->amount, 'comissao' => $incoming_value, 'estado_color' => '#388E3C', 'estado' => 'Pago', 'user_status' => 'payer', 'amount_debited' => $total_amount, 'transaction_type' => 'debit', 'transaction_name' => 'Transferência' ]); $receiverHistory = TransferHistory::create([ 'transaction_id' => $transactionReference, 'sender_account' => $userReceiver->account_number, 'reciever_account' => $userSender->account_number, 'user_id' => $userReceiver->id, 'client_id' => $userSender->id, 'amount' => $request->amount, 'description' => $request->description, 'comissao' => $incoming_value, 'estado_color' => '#388E3C', 'estado' => 'Recebido', 'user_status' => 'receiver', 'amount_debited' => $total_amount, 'transaction_type' => 'credit', 'transaction_name' => 'Transferência' ]); TransactionHistory::create([ 'user_id' => $senderHistory->user_id, 'transfer_history_id' => $senderHistory->id, 'transaction_type' => 'transfer_history' ]); TransactionHistory::create([ 'user_id' => $receiverHistory->user_id, 'transfer_history_id' => $receiverHistory->id, 'transaction_type' => 'transfer' ]); // $bug=2/0; // DADOS DA TABELA ALLTRANSACTIONS // REGISTO DE DEBITO PARA O SENDER AllTransactionController::create_all_transaction( $transferencia->transaction_id, 2, 1, $userSender->name, $userSender->account_number, 1, $userReceiver->name, $userReceiver->account_number, 1, $transferencia->amount, 'Transferencia iMali', $accountSenderOld->balance, $accountSender->balance, $accountReceiverOld->balance, $accountReceiver->balance, $transferencia->status, $transferencia->created_at, 'DEBIT', ); // REGISTO DE DEBITO PARA O RECEIVER AllTransactionController::create_all_transaction( $transferencia->transaction_id, 2, 1, $userSender->name, $userSender->account_number, 1, $userReceiver->name, $userReceiver->account_number, 1, $transferencia->amount, 'Transferencia iMali', $accountSenderOld->balance, $accountSender->balance, $accountReceiverOld->balance, $accountReceiver->balance, $transferencia->status, $transferencia->created_at, 'CREDIT', ); // DADOS DA TABELA ALLTRANSACTIONS $notification = array( 'icon' => 'ic_imali_logo_verde_01', 'title' => 'Recebeste ' . $request->amount . ' MT', 'body' => 'Parabéns, ' . 'recebeste ' . $request->amount . 'MT ' . 'do ' . $request->user()->name, 'click_action' => 'com.imali.payapp.payment_TRANSFER_DETAILS', 'color' => '#ffffff' ); $data = array( 'transaction' => $receiverHistory->transaction_id, 'name' => $request->user()->name, 'amount' => (float)$senderHistory->amount, 'amount_debited' => (float)$receiverHistory->amount_debited, 'account_number' => (int)$accountSender->account_number, 'phone' => $request->user()->phone, 'description' => $request->description, 'data' => $receiverHistory->created_at, 'estado' => $receiverHistory->estado, 'route' => 'TRANSFER_DETAILS', 'comissao' => (float)$receiverHistory->comissao, 'terminal' => 'firebase' ); if ($request->id_request != 0) { $moneyR = MoneyRequest::query()->where('id', $request->id_request)->first(); if ($moneyR) { $moneyR->update([ 'status' => 'sucesso', 'new_balance' => $accountReceiver->balance ]); } } // todo ----- CREDIT_REQUEST if ($request->has('credit_request') && !empty($request->credit_request)) { $accountSender->credit_balance -= $request->amount; $accountSender->update(); // todo ----- new 12/11/2025 $transferencia->credit_request_ref = $request->credit_request; $transferencia->update(); } // todo ----- CREDIT_REQUEST $this->pushNotifification($userReceiver->firebase_token, $notification, $data); // $push_userPayer->sendPush($data); DB::commit(); return response()->json([ 'message' => 'Transferência Feita com Sucesso!', 'transaction' => $transactionReference, 'created_at' => $transferencia->created_at ], 200); } catch (\Throwable $th) { DB::rollBack(); // return response()->json(['message' => 'Erro do Servidor!', $th->getMessage()], 500); Log::info('Error TransferMoneyNEW2024', [ 'content' => $request->url(), 'params' => $request->all(), 'error' => $th, ]); return response()->json(['message' => 'Erro do Servidor!'], 500); } } public function transferMoney2(Request $request) { // return $request->fullUrl(); // return $test; // return $request->header(); // return $request->fullUrl(); // return $request->url(); // return Request::ip(); // return $request->ip(); //return response()->json(['message' => 'Pagamento Feito com Sucesso!', // ], 200); $random = new TransactionGeneration(); $senderUser = User::query()->where('user_id', $request->user()->user_id)->first(); $sender_id = $senderUser->id; $imaliAccountSender = ImaliAccount::query()->where('user_id', $senderUser->id)->first(); $imaliAccountReceiver = ImaliAccount::query()->where('account_number', $request->account_number)->first(); $imaliAccountReceiverCount = ImaliAccount::query()->where('account_number', $request->account_number)->count(); $kyc = ImaliAccount::query() ->join('imali_account_configs', 'imali_account_configs.id', '=', 'imali_accounts.imali_account_config') ->where('user_id', $senderUser->id) ->select('imali_account_configs.*') ->first(); $payments = Payment::query() ->where(['sender_id' => $senderUser->id]) ->whereDate('created_at', date('Y-m-d')) ->get(); // $recevier = User::query()->where('id', $imaliAccountReceiver->user_id)->count(); if ($imaliAccountReceiverCount > 0) { $recevier = User::query()->where('id', $imaliAccountReceiver->user_id)->first(); $kyc = new Kyc(); $request->request->add(['id' => $senderUser->id, 'receiver_id' => $recevier->id]); $result = $kyc->checkSender($request); if ($result) { $log = new Record(); $log->createLog([ 'description' => 'SenderAccount: ' . $imaliAccountSender->account_number . ' ReceiverAccount: ' . $imaliAccountReceiver->account_number, 'details' => $result, 'operation' => 'Transfer Money', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'status' => 'Error', 'origin_ip' => $request->ip(), 'origin_request' => $request->url(), 'user_id' => $request->user()->id ]); return $result; } else { if ($imaliAccountSender) { if ($imaliAccountReceiver->user_id === $imaliAccountSender->user_id) { $log = new Record(); $log->createLog([ 'description' => $imaliAccountSender->account_number . ' ReceiverAccount: ' . $imaliAccountReceiver->account_number, 'details' => 'Não pode Transferir para Si mesmo', 'operation' => 'Transfer Money', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'status' => 'Error', 'origin_ip' => $request->ip(), 'origin_request' => $request->url(), 'user_id' => $request->user()->id ]); return response()->json(['message' => 'Não pode Transferir para si mesmo!', 'class' => 'error'], 400); } elseif ($imaliAccountSender->balance < $request->amount) { $log = new Record(); $log->createLog([ 'description' => $imaliAccountSender->account_number . ' ReceiverAccount: ' . $imaliAccountReceiver->account_number, 'details' => 'Saldo insuficiente', 'operation' => 'Transfer Money', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'status' => 'Error', 'origin_ip' => $request->ip(), 'origin_request' => $request->url(), 'user_id' => $request->user()->id ]); return response()->json(['message' => 'Saldo insuficiente', 'class' => 'error'], 402); } else { $valorAPagar = $request->amount; $points = round($valorAPagar); $imaliAccountConfig = ImaliAccountConfig::find(1); // $valorTaxadoTotal = $valorAPagar + $valorAPagar*($imaliAccountConfig->taxa)/100; $valorTaxadoTotal = $valorAPagar + $imaliAccountConfig->taxa; // Payer or Sender Section DB::table('imali_accounts')->where('user_id', $sender_id)->decrement('balance', $valorTaxadoTotal); // Recever User DB::table('imali_accounts')->where('account_number', $imaliAccountReceiver->account_number)->increment('balance', $valorAPagar); // $profit = $valorAPagar*$valorAPagar*($imaliAccountConfig->taxa)/100; $profit = $imaliAccountConfig->taxa; $transactionReference = $random->generateTransaction(); $imaliAccountSender2 = ImaliAccount::query()->where('user_id', $senderUser->id)->first(); $transferencia = Transfer::create([ 'transaction_id' => $transactionReference, 'sender_id' => $sender_id, 'reciever_id' => $recevier->id, 'reciever_name' => $recevier->name, 'reciever_account' => $imaliAccountReceiver->account_number, 'amount' => $valorAPagar, 'description' => $request->description, 'comissao' => $profit, 'estado_color' => '#388E3C', 'estado' => 'Pago', 'amount_debited' => $valorTaxadoTotal, 'created_at' => now(), 'updated_at' => now(), 'category_id' => 22, 'old_balance' => $imaliAccountSender->balance, 'new_balance' => $imaliAccountSender2->balance ]); TransactionHistory::create([ 'user_id' => $transferencia->sender_id, 'transfer_id' => $transferencia->id, 'category_id' => $transferencia->category_id, 'transaction_type' => 'transfer' ]); $senderHistory = TransferHistory::create([ 'transaction_id' => $transactionReference, 'user_id' => $senderUser->id, // 'account_number' =>$imaliAccountReceiver->account_number, 'client_id' => $recevier->id, 'amount' => $valorAPagar, 'description' => $request->description, 'comissao' => $profit, 'estado_color' => '#388E3C', 'estado' => 'Pago', 'user_status' => 'payer', 'amount_debited' => $valorTaxadoTotal, 'created_at' => now(), 'updated_at' => now(), 'category_id' => $transferencia->category_id ]); TransactionHistory::create([ 'user_id' => $senderHistory->user_id, 'transfer_history_id' => $senderHistory->id, 'category_id' => $senderHistory->category_id, 'transaction_type' => 'transfer' ]); $receiverHistory = TransferHistory::create([ 'transaction_id' => $transactionReference, 'user_id' => $recevier->id, // 'account_number' =>$imaliAccountSender->account_number, 'client_id' => $senderUser->id, 'amount' => $valorAPagar, 'description' => $request->description, 'comissao' => 0, 'estado_color' => '#388E3C', 'estado' => 'Recebido', 'user_status' => 'receiver', 'amount_debited' => 0, 'created_at' => now(), 'updated_at' => now(), 'category_id' => $transferencia->category_id ]); TransactionHistory::create([ 'user_id' => $receiverHistory->user_id, 'transfer_history_id' => $receiverHistory->id, 'category_id' => $receiverHistory->category_id, 'transaction_type' => 'transfer' ]); // $transferencia->paymentHistoric()->create([ // 'sender_account' =>$imaliAccountSender->account_number, // 'sender_name' => $senderUser->name, // 'amount_credited' => $valorTaxadoTotal, // 'status_user' => 'reciever', // 'status' => 'done', // 'comissao' => $profit, // 'amount' =>$valorAPagar, // 'sender_id' => $senderUser->id, // 'user_id' => $recevier->id, // 'actual_points' =>$recevier->points, // 'last_points' =>$recevier->points, // 'win_points' => 0, // 'transaction_id' =>$transferencia->transaction_id // ]); $saveProfit = $transferencia->profit()->create([ 'payer_id' => $senderUser->id, 'payer_account' => $imaliAccountSender->account_number, 'amount' => $valorAPagar, 'amount_credited' => $valorTaxadoTotal, 'comissao' => $profit, 'profit_id' => $transactionReference, 'payment_id' => $transferencia->id, ]); // $sms = new SendSMS(); // $sms->sendSMSTransferSender($transferencia); // $sms->sendSMSTranferReceiver($transferencia); $recevier2 = User::query()->where('id', $imaliAccountReceiver->user_id)->first(); $notification = array( 'icon' => 'ic_imali_logo_verde_01', // 'icon' => 'ic_i_mali_cover', 'title' => 'Recebeste ' . $request->amount . ' MT', 'body' => 'Parabéns, ' . ' recebeste ' . $request->amount . ' MT ' . ' do ' . $request->user()->name, 'click_action' => 'com.imali.payapp.payment_TRANSFER_DETAILS', // 'color' => '#008577' 'color' => '#ffffff' ); // $data = array( // 'transaction' => $receiverHistory->transaction_id, // 'name' => $request->user()->name, // 'amount' => $receiverHistory->amount, // 'amount_debited' => $receiverHistory->amount_debited, // 'account_number' => $request->account_number, // 'phone' => $request->user()->phone, // 'description' => $request->description, // 'data' => $receiverHistory->created_at, // 'estado' => $receiverHistory->estado, // 'comissao' => $receiverHistory->comissao, // ); $data = array( 'transaction' => $receiverHistory->transaction_id, 'name' => $request->user()->name, 'amount' => (float)$senderHistory->amount, 'amount_debited' => (float)$receiverHistory->amount_debited, 'account_number' => (int)$imaliAccountSender->account_number, 'phone' => $request->user()->phone, 'description' => $request->description, 'data' => $receiverHistory->created_at, 'estado' => $receiverHistory->estado, 'route' => 'TRANSFER_DETAILS', 'comissao' => (float)$receiverHistory->comissao, 'terminal' => 'firebase' ); $this->pushNotifification($recevier2->firebase_token, $notification, $data); if ($request->id_request != 0) { $moneyR = MoneyRequest::query()->where('id', $request->id_request)->first(); if ($moneyR) { $moneyR->update([ 'status' => 'sucesso' ]); } } if ($saveProfit) { $log = new Record(); $log->createLog([ 'description' => $imaliAccountSender->account_number, 'details' => 'Transferência feita com Sucesso' . ' ReceiverAccount: ' . $imaliAccountReceiver->account_number, 'operation' => 'Transfer Money', 'status' => 'Success', 'properties' => json_encode($request->except(['pin'])), 'user_id' => $request->user()->id ]); $log->createLog([ 'description' => $imaliAccountSender->account_number . ' ReceiverAccount: ' . $imaliAccountReceiver->account_number, 'details' => 'Transferência Feita com Sucesso!', 'operation' => 'Transfer Money', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'status' => 'Sucess', 'origin_ip' => $request->ip(), 'origin_request' => $request->url(), 'user_id' => $request->user()->id ]); return response()->json([ 'message' => 'Transferência Feita com Sucesso!', 'transaction' => $transactionReference, 'created_at' => $transferencia->created_at ], 200); } } } } } else { $log = new Record(); $log->createLog([ 'description' => $imaliAccountSender->account_number, 'details' => 'Conta i.Mali inválida' . ' ReceiverAccount: ' . $imaliAccountReceiver->account_number, 'operation' => 'Transfer Money', // 'properties' => $request->all(), 'properties' => json_encode($request->except(['pin'])), 'status' => 'Error', 'user_id' => $request->user()->id ]); return response()->json(['message' => 'Conta i.Mali inválida', 'class' => 'error'], 404); } } public function getPayments() { $payments = Payment::query()->join('users', 'users.id', '=', 'payments.sender_id') ->join('stores', 'stores.id', 'payments.store_id') ->join('imali_accounts', 'imali_accounts.user_id', 'payments.sender_id') ->orderBy('payments.created_at', 'desc') ->select('payments.*', 'users.name as client_name', 'stores.name as merchant_name', 'stores.account_number as merchant_account', 'imali_accounts.account_number as client_account') ->get(); return response()->json(['data' => $payments], 200); } public function getMyPayments($id) { $payments = Payment::query()->join('users', 'users.id', '=', 'payments.sender_id') ->join('stores', 'stores.id', '=', 'payments.store_id') ->join('imali_accounts', 'imali_accounts.user_id', 'payments.sender_id') ->where('payments.sender_id', $id) ->orderBy('payments.created_at', 'desc') ->select('payments.*', 'users.name as client_name', 'stores.name as merchant_name', 'stores.account_number as merchant_account', 'imali_accounts.account_number as client_account') ->get(); return response()->json(['data' => $payments], 200); } public function getMyPayments2(Request $request) { $size = (!request()->per_page) ? 4 : request()->per_page; $new_start_date = null; $new_end_date = null; if ($request->filled('start_date')) { $start_date = explode('-', $request->start_date); if (strlen($start_date[2]) >= 4) $new_start_date = $start_date[2] . '-' . $start_date[1] . '-' . $start_date[0]; } if ($request->filled('end_date')) { $end_date = explode('-', $request->end_date); if (strlen($end_date[2]) >= 4) $new_end_date = $end_date[2] . '-' . $end_date[1] . '-' . $end_date[0]; } // return $new_start_date; $payments = Payment::query() ->join('users', 'users.id', '=', 'payments.sender_id') ->join('stores', 'stores.id', '=', 'payments.store_id') ->leftJoin('imali_accounts', 'imali_accounts.user_id', 'payments.sender_id') ->leftJoin('business_accounts', 'business_accounts.user_id', 'payments.sender_id') // ->join('ramo_activities', 'ramo_activities.id', 'payments.store_id') ->leftJoin('ramo_activities', 'ramo_activities.id', '=', 'payments.category_id') ->where('payments.sender_id', $request->user()->id) ->where('payments.is_real_payment', 1) // new ------------------------ ->when($request->filled('start_date'), function ($query) use ($request, $new_start_date) { $query->whereDate('payments.created_at', '>=', $new_start_date ?? $request->start_date); }) ->when($request->filled('end_date'), function ($query) use ($request, $new_end_date) { $query->whereDate('payments.created_at', '<=', $new_end_date ?? $request->end_date); }) // new ------------------------ ->orderBy('payments.created_at', 'desc') ->select( 'payments.*', 'users.name as client_name', 'users.last_name', 'stores.name as merchant_name', 'stores.account_number as merchant_account', // 'imali_accounts.account_number as client_account', // 'business_accounts.account_number as client_account', DB::raw('COALESCE(imali_accounts.account_number, business_accounts.account_number) as client_account'), 'ramo_activities.nome as category', 'ramo_activities.logo as logo_category' ) //->get(); ->paginate($size); return response()->json($payments, 200); //return response()->json(['data' => $payments], 200); } public function getMyPayments3(Request $request) { $payments = Payment::query() ->join('users', 'users.id', '=', 'payments.sender_id') ->join('stores', 'stores.id', '=', 'payments.store_id') ->join('imali_accounts', 'imali_accounts.user_id', 'payments.sender_id') // ->leftJoin('ramo_activities', 'ramo_activities.id','=', 'payments.store_id') ->leftJoin('ramo_activities', 'ramo_activities.id', '=', 'payments.category_id') // ->where('payments.sender_id', $request->user()->id) ->where('payments.sender_id', '=', 1) ->orderBy('payments.created_at', 'desc') ->select( 'payments.*', 'users.name as client_name', 'users.last_name', 'stores.name as merchant_name', 'stores.account_number as merchant_account', 'imali_accounts.account_number as client_account', 'ramo_activities.nome as category', 'ramo_activities.logo as logo_category' ) ->get(); return response()->json(['data' => $payments], 200); } public function getTransferencias() { $transfers = Transfer::query()->join('users', 'users.id', '=', 'transfers.sender_id') ->join('imali_accounts', 'imali_accounts.user_id', 'transfers.sender_id') ->orderBy('transfers.created_at', 'desc') ->select('transfers.*', 'users.name as sender_name', 'imali_accounts.account_number as sender_account') ->get(); return response()->json(['data' => $transfers], 200); } public function getMyTransferencias($id) { // $transfers = Transfer::query()->join('users', 'users.id', '=', 'transfers.sender_id') // ->join('imali_accounts', 'imali_accounts.user_id', 'transfers.sender_id') // ->where('transfers.sender_id', $id) // ->orderBy('transfers.created_at', 'desc') // ->select('transfers.*', 'users.name as sender_name', 'imali_accounts.account_number as sender_account') // ->get(); // return response()->json(['data' => $transfers], 200); $size = (!request()->per_page) ? 4 : request()->per_page; $withdrawals = WithdrawalsRequest::query() // ->where('user_id', $request->user()->id) ->where('user_id', $id) ->select( 'withdrawals_requests.id as id', 'withdrawals_requests.transaction_id as transaction_id', 'withdrawals_requests.imali_account as imali_account', 'withdrawals_requests.account_number as account_number', 'withdrawals_requests.account_type as account_type', 'withdrawals_requests.description as description', 'withdrawals_requests.status as status', 'withdrawals_requests.amount as amount', 'withdrawals_requests.commission as commission', 'withdrawals_requests.bank_fee as bank_fee', 'withdrawals_requests.stamp_tax as stamp_tax', 'withdrawals_requests.imali_fee as imali_fee', 'withdrawals_requests.total as total', 'withdrawals_requests.old_balance as old_balance', 'withdrawals_requests.new_balance as new_balance', 'withdrawals_requests.user_id as user_id', 'withdrawals_requests.wallets_id as wallets_id', 'withdrawals_requests.operators_id as operators_id', 'withdrawals_requests.moza_message as moza_message', 'withdrawals_requests.imali_account_id as imali_account_id', DB::raw("'NULL' as reciever_id"), DB::raw("'NULL' as reciever_account"), // DB::raw("'NULL' as reciever_name"), 'withdrawals_requests.reciever_name as reciever_name', DB::raw("'NULL' as amount_debited"), DB::raw("'NULL' as estado_color"), DB::raw("'NULL' as category_id"), // DB::raw("'NULL' as sender_name"), 'withdrawals_requests.sender_name as sender_name', 'withdrawals_requests.created_at as created_at', 'withdrawals_requests.updated_at as updated_at', ) ->orderBy('withdrawals_requests.created_at', 'desc'); $transfers = Transfer::query() ->join('users', 'users.id', '=', 'transfers.sender_id') ->join('imali_accounts', 'imali_accounts.user_id', 'transfers.sender_id') // ->where('transfers.sender_id', $request->user()->id) ->where('transfers.sender_id', $id) ->select( 'transfers.id as id', 'transfers.transaction_id as transaction_id', DB::raw("'NULL' as imali_account"), 'imali_accounts.account_number as account_number', 'users.profile as account_type', DB::raw("'TRF. iMali' as description"), 'transfers.estado as status', 'transfers.amount as amount', 'transfers.comissao as commission', DB::raw("'0' as bank_fee"), DB::raw("'0' as stamp_tax"), DB::raw("'0' as imali_fee"), DB::raw("'0' as total"), 'transfers.old_balance as old_balance', 'transfers.new_balance as new_balance', 'transfers.sender_id as user_id', DB::raw("'NULL' as wallets_id"), DB::raw("'NULL' as operators_id"), DB::raw("'No message' as moza_message"), DB::raw("'NULL' as imali_account_id"), 'transfers.reciever_id as reciever_id', 'transfers.reciever_account as reciever_account', 'transfers.reciever_name as reciever_name', 'transfers.amount_debited as amount_debited', 'transfers.estado_color as estado_color', 'transfers.category_id as category_id', 'users.name as sender_name', 'transfers.created_at as created_at', 'transfers.updated_at as updated_at', ) ->orderBy('transfers.created_at', 'desc'); $results = $withdrawals->union($transfers)->paginate($size); return response()->json($results, 200); } public function getCarregamentos() { $carregamento = ImaliAccount::query() ->join('users', 'users.id', 'imali_accounts.user_id') ->join('recharge_imali_accounts', 'recharge_imali_accounts.imali_account_id', 'imali_accounts.id') ->orderBy('recharge_imali_accounts.created_at', 'desc') ->select('users.name as user_name', 'imali_accounts.account_number as user_account', 'recharge_imali_accounts.*')->get(); return response()->json(['data' => $carregamento], 200); } public function getMyCarregamentos2($id) { $carregamento = ImaliAccount::query() ->join('users', 'users.id', 'imali_accounts.user_id') ->join('recharge_imali_accounts', 'recharge_imali_accounts.imali_account_id', 'imali_accounts.id') ->where('users.id', $id) ->orderBy('recharge_imali_accounts.created_at', 'desc') ->select('users.name as user_name', 'imali_accounts.reference', 'imali_accounts.account_number', 'recharge_imali_accounts.*')->get(); return response()->json(['data' => $carregamento], 200); } public function getMyCarregamentos(Request $request) { // $carregamento = ImaliAccount::query() // ->join('users', 'users.id', 'imali_accounts.user_id') // ->join('recharge_imali_accounts', 'recharge_imali_accounts.imali_account_id', 'imali_accounts.id') // ->where('users.id', auth()->user()->id) // ->orderBy('recharge_imali_accounts.created_at', 'desc') // ->select('users.name as user_name', 'imali_accounts.account_number as user_account', 'recharge_imali_accounts.*')->get(); // return response()->json(['data' => $carregamento], 200); $size = (!request()->per_page) ? 4 : request()->per_page; $new_start_date = null; $new_end_date = null; if ($request->filled('start_date')) { $start_date = explode('-', $request->start_date); if (strlen($start_date[2]) >= 4) $new_start_date = $start_date[2] . '-' . $start_date[1] . '-' . $start_date[0]; } if ($request->filled('end_date')) { $end_date = explode('-', $request->end_date); if (strlen($end_date[2]) >= 4) $new_end_date = $end_date[2] . '-' . $end_date[1] . '-' . $end_date[0]; } $carregamento = ImaliAccount::query() ->join('users', 'users.id', 'imali_accounts.user_id') ->join('recharge_imali_accounts', 'recharge_imali_accounts.imali_account_id', 'imali_accounts.id') ->where('users.id', $request->user()->id) // new ------------------------ ->when($request->filled('start_date'), function ($query) use ($request, $new_start_date) { $query->whereDate('recharge_imali_accounts.created_at', '>=', $new_start_date ?? $request->start_date); }) ->when($request->filled('end_date'), function ($query) use ($request, $new_end_date) { $query->whereDate('recharge_imali_accounts.created_at', '<=', $new_end_date ?? $request->end_date); }) // new ------------------------ ->orderBy('recharge_imali_accounts.created_at', 'desc') ->select('users.name as user_name', 'users.last_name', 'imali_accounts.reference', 'imali_accounts.account_number', 'recharge_imali_accounts.*') //->get(); ->paginate($size); return response()->json($carregamento, 200); // return response()->json(['data' => $carregamento], 200); } //? NEW WITHDRAWALLS public function getMyWithDrawalls(Request $request) { $size = (!request()->per_page) ? 4 : request()->per_page; $withdrawalls = WithdrawalsRequest::query() ->where('user_id', $request->user()->id) ->orderBy('created_at', 'desc') ->paginate($size); return response()->json($withdrawalls, 200); } //? NEW WITHDRAWALLS public function getTransferenciasHistory($id) { // $transfers = TransferHistory::query() // ->join('users', 'users.id', '=', 'transfer_histories.client_id') // ->join('users as sender', 'sender.id', '=', 'transfer_histories.user_id') // ->join('users as receiver', 'receiver.id', '=', 'transfer_histories.user_id') // ->join('imali_accounts as imaliSender', 'imaliSender.user_id','=', 'transfer_histories.user_id') // ->join('imali_accounts as imaliReceiver', 'imaliReceiver.user_id','=', 'transfer_histories.user_id') // ->join('imali_accounts', 'imali_accounts.user_id','=', 'transfer_histories.client_id') // ->where('transfer_histories.user_id', $id) //// ->where('transfer_histories.receiver_id', $id) // ->orderBy('transfer_histories.created_at', 'desc') // ->select( // 'transfer_histories.*', // 'sender.name as name_sender', // 'receiver.name as name_receiver', // 'imaliSender.account_number as account_sender', // 'imaliReceiver.account_number as account_receiver', // 'users.name', // 'imali_accounts.account_number' // ) // ->get(); $transfers = TransferHistory::query() ->join('users', 'users.id', '=', 'transfer_histories.client_id') ->join('users as sender', 'sender.id', '=', 'transfer_histories.user_id') ->join('users as receiver', 'receiver.id', '=', 'transfer_histories.user_id') ->join('imali_accounts as imaliSender', 'imaliSender.user_id', '=', 'transfer_histories.user_id') ->join('imali_accounts as imaliReceiver', 'imaliReceiver.user_id', '=', 'transfer_histories.user_id') ->join('imali_accounts', 'imali_accounts.user_id', '=', 'transfer_histories.client_id') ->where('transfer_histories.user_id', $id) // ->where('transfer_histories.receiver_id', $id) ->orderBy('transfer_histories.created_at', 'desc') ->select( 'transfer_histories.*', 'users.name', 'imali_accounts.account_number' ) ->get(); return response()->json(['data' => $transfers], 200); } public function getTransferenciasHistoryData(Request $request) { // $transfers = TransferHistory::query() // ->join('users', 'users.id', '=', 'transfer_histories.client_id') // ->join('users as sender', 'sender.id', '=', 'transfer_histories.user_id') // ->join('users as receiver', 'receiver.id', '=', 'transfer_histories.user_id') // ->join('imali_accounts as imaliSender', 'imaliSender.user_id', '=', 'transfer_histories.user_id') // ->join('imali_accounts as imaliReceiver', 'imaliReceiver.user_id', '=', 'transfer_histories.user_id') // ->join('imali_accounts', 'imali_accounts.user_id', '=', 'transfer_histories.client_id') // ->where('transfer_histories.user_id', auth()->user()->id) //// ->where('transfer_histories.receiver_id', $id) // ->orderBy('transfer_histories.created_at', 'desc') // ->select( // 'transfer_histories.*', // 'users.name', // 'imali_accounts.account_number' // ) // ->get(); // return response()->json(['data' => $transfers], 200); $size = (!request()->per_page) ? 4 : request()->per_page; $transfers = TransferHistory::query() ->join('users', 'users.id', '=', 'transfer_histories.client_id') ->join('users as sender', 'sender.id', '=', 'transfer_histories.user_id') ->join('users as receiver', 'receiver.id', '=', 'transfer_histories.user_id') ->join('imali_accounts as imaliSender', 'imaliSender.user_id', '=', 'transfer_histories.user_id') ->join('imali_accounts as imaliReceiver', 'imaliReceiver.user_id', '=', 'transfer_histories.user_id') ->join('imali_accounts', 'imali_accounts.user_id', '=', 'transfer_histories.client_id') ->where('transfer_histories.user_id', $request->user()->id) // ->where('transfer_histories.receiver_id', $id) ->orderBy('transfer_histories.created_at', 'desc') ->select( 'transfer_histories.*', 'users.name', 'imali_accounts.account_number', 'imaliSender.account_number as account_number_sender', 'sender.name as name_sender', 'sender.last_name as last_name_sender', 'users.name as name_receiver', 'users.last_name as last_name_receiver', ) // ->get(); ->paginate($size); return response()->json($transfers, 200); } public function getTransferenciasHistoryData2024(Request $request) { // $transfers = TransferHistory::query() // ->join('users', 'users.id', '=', 'transfer_histories.client_id') // ->join('users as sender', 'sender.id', '=', 'transfer_histories.user_id') // ->join('users as receiver', 'receiver.id', '=', 'transfer_histories.user_id') // ->join('imali_accounts as imaliSender', 'imaliSender.user_id', '=', 'transfer_histories.user_id') // ->join('imali_accounts as imaliReceiver', 'imaliReceiver.user_id', '=', 'transfer_histories.user_id') // ->join('imali_accounts', 'imali_accounts.user_id', '=', 'transfer_histories.client_id') // ->where('transfer_histories.user_id', auth()->user()->id) //// ->where('transfer_histories.receiver_id', $id) // ->orderBy('transfer_histories.created_at', 'desc') // ->select( // 'transfer_histories.*', // 'users.name', // 'imali_accounts.account_number' // ) // ->get(); // return response()->json(['data' => $transfers], 200); //PEGAR DADOS DAS TRANSACOES FEITAS PELAS SUBCONTAS $data_transfer = TransferHistory::query() ->join('transfers', 'transfers.transaction_id', 'transfer_histories.transaction_id') ->where('transfer_histories.user_id', $request->user()->id)->orderBy('transfers.created_at', 'desc') ->select('transfer_histories.*', 'transfers.sender_account', 'transfers.reciever_account') //->latest(); ->first(); // Verificar se o terceiro dígito do sender_account ou receiver_account é diferente de 0 if ($this->checkAccount($data_transfer->sender_account) || $this->checkAccount($data_transfer->reciever_account)) { // return "subconta"; $size = (!request()->per_page) ? 4 : request()->per_page; $transfers = TransferHistory::query() ->join('transfers', 'transfers.transaction_id', '=', 'transfer_histories.transaction_id') ->join('users', 'users.id', '=', 'transfer_histories.client_id') ->join('users as sender', 'sender.id', '=', 'transfer_histories.user_id') ->join('users as receiver', 'receiver.id', '=', 'transfer_histories.user_id') ->join('imali_accounts as imaliSender', 'imaliSender.user_id', '=', 'transfer_histories.user_id') ->join('imali_accounts as imaliReceiver', 'imaliReceiver.user_id', '=', 'transfer_histories.user_id') ->join('imali_accounts', 'imali_accounts.user_id', '=', 'transfer_histories.client_id') ->where('transfer_histories.user_id', $request->user()->id) ->orderBy('transfer_histories.created_at', 'desc') ->select( 'transfer_histories.*', 'transfers.reciever_name as name', 'transfers.reciever_account as account_number', 'imaliSender.account_number as account_number_sender', 'sender.name as name_sender', 'sender.last_name as last_name_sender', 'transfers.reciever_name as name_receiver', 'users.last_name as last_name_receiver', ) ->paginate($size); // $transfers = TransferHistory::query() // ->join('users', 'users.id', '=', 'transfer_histories.client_id') // ->join('users as sender', 'sender.id', '=', 'transfer_histories.user_id') // ->join('users as receiver', 'receiver.id', '=', 'transfer_histories.user_id') // ->join('imali_accounts as imaliSender', 'imaliSender.user_id', '=', 'transfer_histories.user_id') // ->join('imali_accounts as imaliReceiver', 'imaliReceiver.user_id', '=', 'transfer_histories.user_id') // ->join('imali_accounts', 'imali_accounts.user_id', '=', 'transfer_histories.client_id') // ->where('transfer_histories.user_id', $request->user()->id) // ->orderBy('transfer_histories.created_at', 'desc') // ->select( // 'transfer_histories.*', // 'users.name', // 'imali_accounts.account_number', // 'imaliSender.account_number as account_number_sender', // 'sender.name as name_sender', // 'sender.last_name as last_name_sender', // 'users.name as name_receiver', // 'users.last_name as last_name_receiver', // ) // ->paginate($size); return response()->json($transfers, 200); } else { // return "não subconta"; $size = (!request()->per_page) ? 4 : request()->per_page; $transfers = TransferHistory::query() ->join('users', 'users.id', '=', 'transfer_histories.client_id') ->join('users as sender', 'sender.id', '=', 'transfer_histories.user_id') ->join('users as receiver', 'receiver.id', '=', 'transfer_histories.user_id') ->join('imali_accounts as imaliSender', 'imaliSender.user_id', '=', 'transfer_histories.user_id') ->join('imali_accounts as imaliReceiver', 'imaliReceiver.user_id', '=', 'transfer_histories.user_id') ->join('imali_accounts', 'imali_accounts.user_id', '=', 'transfer_histories.client_id') ->where('transfer_histories.user_id', $request->user()->id) // ->where('transfer_histories.receiver_id', $id) ->orderBy('transfer_histories.created_at', 'desc') ->select( 'transfer_histories.*', 'users.name', 'imali_accounts.account_number', 'imaliSender.account_number as account_number_sender', 'sender.name as name_sender', 'sender.last_name as last_name_sender', 'users.name as name_receiver', 'users.last_name as last_name_receiver', ) // ->get(); ->paginate($size); return response()->json($transfers, 200); } //PEGAR DADOS DAS TRANSACOES FEITAS PELAS SUBCONTAS // $size = (!request()->per_page) ? 4 : request()->per_page; // $transfers = TransferHistory::query() // ->join('users', 'users.id', '=', 'transfer_histories.client_id') // ->join('users as sender', 'sender.id', '=', 'transfer_histories.user_id') // ->join('users as receiver', 'receiver.id', '=', 'transfer_histories.user_id') // ->join('imali_accounts as imaliSender', 'imaliSender.user_id', '=', 'transfer_histories.user_id') // ->join('imali_accounts as imaliReceiver', 'imaliReceiver.user_id', '=', 'transfer_histories.user_id') // ->join('imali_accounts', 'imali_accounts.user_id', '=', 'transfer_histories.client_id') // ->where('transfer_histories.user_id', $request->user()->id) // // ->where('transfer_histories.receiver_id', $id) // ->orderBy('transfer_histories.created_at', 'desc') // ->select( // 'transfer_histories.*', // 'users.name', // 'imali_accounts.account_number', // 'imaliSender.account_number as account_number_sender', // 'sender.name as name_sender', // 'sender.last_name as last_name_sender', // 'users.name as name_receiver', // 'users.last_name as last_name_receiver', // ) // // ->get(); // ->paginate($size); // return response()->json($transfers, 200); // return response()->json(['data' => $transfers], 200); // // todo ------------------------------------------------------------------- // $size = (!request()->per_page) ? 4 : request()->per_page; // $withdrawals = WithdrawalsRequest::query() // // ->where('user_id', $request->user()->id) // ->where('user_id', $request->user()->id) // ->select( // 'withdrawals_requests.id as id', // 'withdrawals_requests.transaction_id as transaction_id', // 'withdrawals_requests.imali_account as imali_account', // 'withdrawals_requests.account_number as account_number', // 'withdrawals_requests.account_type as account_type', // 'withdrawals_requests.description as description', // 'withdrawals_requests.status as status', // 'withdrawals_requests.amount as amount', // 'withdrawals_requests.commission as commission', // 'withdrawals_requests.bank_fee as bank_fee', // 'withdrawals_requests.stamp_tax as stamp_tax', // 'withdrawals_requests.imali_fee as imali_fee', // 'withdrawals_requests.total as total', // 'withdrawals_requests.old_balance as old_balance', // 'withdrawals_requests.new_balance as new_balance', // 'withdrawals_requests.user_id as user_id', // 'withdrawals_requests.wallets_id as wallets_id', // 'withdrawals_requests.operators_id as operators_id', // 'withdrawals_requests.moza_message as moza_message', // 'withdrawals_requests.imali_account_id as imali_account_id', // DB::raw("'NULL' as reciever_id"), // DB::raw("'NULL' as reciever_account"), // // DB::raw("'NULL' as reciever_name"), // 'withdrawals_requests.reciever_name as reciever_name', // DB::raw("'NULL' as amount_debited"), // DB::raw("'#388E3C' as estado_color"), // DB::raw("'NULL' as category_id"), // // DB::raw("'NULL' as sender_name"), // 'withdrawals_requests.sender_name as sender_name', // 'withdrawals_requests.created_at as created_at', // 'withdrawals_requests.updated_at as updated_at', // DB::raw("withdrawals_requests.commission as comissao"), // DB::raw("withdrawals_requests.status as estado"), // DB::raw("'NULL' as user_status"), // // DB::raw("'NULL' as name"), // // DB::raw("'NULL' as account_number"), // DB::raw("withdrawals_requests.account_number as account_number_sender"), // DB::raw("withdrawals_requests.sender_name as name_sender"), // DB::raw("'NULL' as last_name_sender"), // DB::raw("'NULL' as name_receiver"), // DB::raw("'NULL' as last_name_receiver"), // ) // ->orderBy('withdrawals_requests.created_at', 'desc'); // $transfers = Transfer::query() // ->join('users', 'users.id', '=', 'transfers.sender_id') // ->join('imali_accounts', 'imali_accounts.user_id', 'transfers.sender_id') // // todo acrescentado.... // ->join('transfer_histories', 'transfer_histories.user_id', 'transfers.sender_id') // ->join('imali_accounts as imaliSender', 'imaliSender.user_id', '=', 'transfers.sender_id') // ->join('users as receiver', 'receiver.id', '=', 'transfers.reciever_id') // // todo acrescentado.... // // ->where('transfers.sender_id', $request->user()->id) // ->where('transfers.sender_id', $request->user()->id) // ->select( // 'transfers.id as id', // 'transfers.transaction_id as transaction_id', // DB::raw("'NULL' as imali_account"), // 'imali_accounts.account_number as account_number', // 'users.profile as account_type', // DB::raw("'TRF. iMali' as description"), // 'transfers.estado as status', // 'transfers.amount as amount', // 'transfers.comissao as commission', // DB::raw("'0' as bank_fee"), // DB::raw("'0' as stamp_tax"), // DB::raw("'0' as imali_fee"), // DB::raw("'0' as total"), // 'transfers.old_balance as old_balance', // 'transfers.new_balance as new_balance', // 'transfers.sender_id as user_id', // DB::raw("'NULL' as wallets_id"), // DB::raw("'NULL' as operators_id"), // DB::raw("'No message' as moza_message"), // DB::raw("'NULL' as imali_account_id"), // 'transfers.reciever_id as reciever_id', // 'transfers.reciever_account as reciever_account', // 'transfers.reciever_name as reciever_name', // 'transfers.amount_debited as amount_debited', // 'transfers.estado_color as estado_color', // 'transfers.category_id as category_id', // 'users.name as sender_name', // 'transfers.created_at as created_at', // 'transfers.updated_at as updated_at', // 'transfer_histories.comissao as comissao', // 'transfer_histories.estado as estado', // 'transfer_histories.user_status as user_status', // // 'transfer_histories.name as name', // // 'transfer_histories.account_number as account_number', // 'imaliSender.account_number as account_number_sender', // 'users.name as name_sender', // 'users.last_name as last_name_sender', // 'transfers.reciever_name as name_receiver', // 'receiver.last_name as last_name_receiver', // ) // ->orderBy('transfers.created_at', 'desc'); // $results = $withdrawals->union($transfers)->paginate($size); // return response()->json($results, 200); // // todo ------------------------------------------------------------------- } // Função para verificar se o terceiro dígito de um número é diferente de 0 private function checkAccount($numero) { return substr($numero, 2, 1) !== '0'; } public function getTransferInEx2024(Request $request) { $size = (!request()->per_page) ? 4 : request()->per_page; $withdrawals = WithdrawalsRequest::query() ->where('user_id', $request->user()->id) ->select( 'withdrawals_requests.id as id', 'withdrawals_requests.transaction_id as transaction_id', 'withdrawals_requests.account_number as account_number', DB::raw("'NULL' as account_number_sender"), 'withdrawals_requests.description as description', 'withdrawals_requests.reciever_name as name_receiver', DB::raw("withdrawals_requests.sender_name as name_sender"), 'withdrawals_requests.amount as amount', 'withdrawals_requests.imali_fee as imali_fee', 'withdrawals_requests.total as total', //DB::raw("'NULL' as client_id"), DB::raw("'NULL' as user_status"), //'withdrawals_requests.status as status', DB::raw( "CASE WHEN withdrawals_requests.status = 'success' THEN 'Sucesso' WHEN withdrawals_requests.status = 'pending' THEN 'Pendente' WHEN withdrawals_requests.status = 'completed' THEN 'Concluído' WHEN withdrawals_requests.status = 'failed' THEN 'Falhou' ELSE withdrawals_requests.status END as status" ), 'withdrawals_requests.created_at as created_at', 'withdrawals_requests.updated_at as updated_at', DB::raw("'external' as transfer_type"), 'withdrawals_requests.user_id as sender_id', ) ->orderBy('withdrawals_requests.created_at', 'desc'); //->orderBy('withdrawals_requests.id', 'desc'); // $transfers = Transfer::query() // ->join('users', 'users.id', '=', 'transfers.sender_id') // ->join('imali_accounts', 'imali_accounts.user_id', 'transfers.sender_id') // ->join('imali_accounts as imaliSender', 'imaliSender.user_id', '=', 'transfers.sender_id') // ->join('users as receiver', 'receiver.id', '=', 'transfers.reciever_id') // ->where('transfers.sender_id', $request->user()->id) // ->select( // 'transfers.id as id', // 'transfers.transaction_id as transaction_id', // 'transfers.reciever_account as account_number', // DB::raw("'TRF. iMali' as description"), // 'transfers.reciever_name as name_receiver', // 'users.name as name_sender', // 'transfers.amount as amount', // DB::raw("'0' as imali_fee"), // 'transfers.amount as total', // DB::raw("CASE WHEN transfers.estado = 'Pago' THEN 'Sucesso' ELSE transfers.estado END as status"), // 'transfers.created_at as created_at', // 'transfers.updated_at as updated_at', // DB::raw("'internal' as transfer_type"), // 'transfers.sender_id as sender_id', // ) // ->orderBy('transfers.created_at', 'desc'); // todo ---- $transfers = TransferHistory::query() ->join('users', 'users.id', '=', 'transfer_histories.client_id') ->join('users as sender', 'sender.id', '=', 'transfer_histories.user_id') ->join('users as receiver', 'receiver.id', '=', 'transfer_histories.user_id') ->join('imali_accounts as imaliSender', 'imaliSender.user_id', '=', 'transfer_histories.user_id') ->join('imali_accounts as imaliReceiver', 'imaliReceiver.user_id', '=', 'transfer_histories.user_id') ->join('imali_accounts', 'imali_accounts.user_id', '=', 'transfer_histories.client_id') ->join('transfers', 'transfers.transaction_id', '=', 'transfer_histories.transaction_id') ->where('transfer_histories.user_id', $request->user()->id) ->orderBy('transfer_histories.created_at', 'desc') ->select( 'transfer_histories.id as id', 'transfer_histories.transaction_id as transaction_id', 'imali_accounts.account_number as account_number', 'imaliSender.account_number as account_number_sender', DB::raw("'TRF. iMali' as description"), 'users.name as name_receiver', 'sender.name as name_sender', 'transfers.amount as amount', DB::raw("'0' as imali_fee"), 'transfers.amount as total', 'transfer_histories.user_status', DB::raw("CASE WHEN transfers.estado = 'Pago' THEN 'Sucesso' WHEN transfers.estado = 'Recebido' THEN 'Recebido' ELSE transfers.estado END as status"), 'transfers.created_at as created_at', 'transfers.updated_at as updated_at', DB::raw("'internal' as transfer_type"), 'transfers.sender_id as sender_id', ) ->orderBy('transfer_histories.created_at', 'desc'); // ->orderBy('transfer_histories.id', 'desc'); // ->get(); // todo ---- //$results = $withdrawals->union($transfers)->paginate($size); $results = $withdrawals->union($transfers)->orderBy('created_at', 'desc')->paginate($size); return response()->json($results, 200); } // public function getTransfersEx2(){} public function getTransferInEx(Request $request) { $size = (!request()->per_page) ? 4 : request()->per_page; $new_start_date = null; $new_end_date = null; if ($request->filled('start_date')) { $start_date = explode('-', $request->start_date); if (strlen($start_date[2]) >= 4) $new_start_date = $start_date[2] . '-' . $start_date[1] . '-' . $start_date[0]; } if ($request->filled('end_date')) { $end_date = explode('-', $request->end_date); if (strlen($end_date[2]) >= 4) $new_end_date = $end_date[2] . '-' . $end_date[1] . '-' . $end_date[0]; } $transfers = $this->getMyTransfers($request, $request->user()->id, $new_start_date, $new_end_date); $withdrawals = $this->getMyWithdralls($request, $request->user()->id, $new_start_date, $new_end_date); $results = $withdrawals->union($transfers) ->orderBy('created_at', 'desc') ->paginate($size); return response()->json($results, 200); } private function getMyTransfers(Request $request, $user_id, $new_start_date, $new_end_date) { return TransferHistory::query() ->join('transfers', 'transfers.transaction_id', '=', 'transfer_histories.transaction_id') ->where('user_id', $user_id) // new ------------------------ ->when($request->filled('start_date'), function ($query) use ($request, $new_start_date) { $query->whereDate('transfer_histories.created_at', '>=', $new_start_date ?? $request->start_date); }) ->when($request->filled('end_date'), function ($query) use ($request, $new_end_date) { $query->whereDate('transfer_histories.created_at', '<=', $new_end_date ?? $request->end_date); }) // new ------------------------ ->orderBy('transfer_histories.created_at', 'desc') ->select( 'transfer_histories.id as id', 'transfer_histories.transaction_id as transaction_id', //'transfers.reciever_account as account_number', DB::raw("CASE WHEN transfer_histories.user_status = 'payer' THEN transfers.reciever_account WHEN transfer_histories.user_status = 'receiver' THEN transfers.sender_account ELSE transfers.reciever_account END as reciever_account"), 'transfers.sender_account as account_number_sender', DB::raw("'TRF. iMali' as description"), DB::raw("CASE WHEN transfer_histories.user_status = 'payer' THEN transfers.reciever_name WHEN transfer_histories.user_status = 'receiver' THEN transfers.sender_name ELSE transfers.reciever_name END as reciever_name"), //'transfers.reciever_name as name_receiver', 'transfers.sender_name as name_sender', 'transfers.amount as amount', DB::raw("'0' as imali_fee"), 'transfers.amount as total', 'transfer_histories.user_status', DB::raw("CASE WHEN transfers.estado = 'Pago' THEN 'Sucesso' WHEN transfers.estado = 'Recebido' THEN 'Recebido' ELSE transfers.estado END as status"), 'transfers.created_at as created_at', 'transfers.updated_at as updated_at', DB::raw("'internal' as transfer_type"), 'transfers.sender_id as sender_id', ); } private function getMyWithdralls(Request $request, $user_id, $new_start_date, $new_end_date) { return WithdrawalsRequest::query() ->where('user_id', $user_id) // new ------------------------ ->when($request->filled('start_date'), function ($query) use ($request, $new_start_date) { $query->whereDate('withdrawals_requests.created_at', '>=', $new_start_date ?? $request->start_date); }) ->when($request->filled('end_date'), function ($query) use ($request, $new_end_date) { $query->whereDate('withdrawals_requests.created_at', '<=', $new_end_date ?? $request->end_date); }) // new ------------------------ ->select( 'withdrawals_requests.id as id', 'withdrawals_requests.transaction_id as transaction_id', 'withdrawals_requests.account_number as account_number', DB::raw("'NULL' as account_number_sender"), 'withdrawals_requests.description as description', 'withdrawals_requests.reciever_name as name_receiver', DB::raw("withdrawals_requests.sender_name as name_sender"), 'withdrawals_requests.amount as amount', 'withdrawals_requests.imali_fee as imali_fee', 'withdrawals_requests.total as total', DB::raw("'NULL' as user_status"), DB::raw( "CASE WHEN withdrawals_requests.status = 'success' THEN 'Sucesso' WHEN withdrawals_requests.status = 'pending' THEN 'Pendente' WHEN withdrawals_requests.status = 'completed' THEN 'Concluído' WHEN withdrawals_requests.status = 'failed' THEN 'Falhou' ELSE withdrawals_requests.status END as status" ), 'withdrawals_requests.created_at as created_at', 'withdrawals_requests.updated_at as updated_at', DB::raw("'external' as transfer_type"), 'withdrawals_requests.user_id as sender_id', ) ->orderBy('withdrawals_requests.created_at', 'desc'); } // todo -- adicionado 15-04-24 public function getTransferInExOLD(Request $request) { $data_transfer = TransferHistory::query() ->join('transfers', 'transfers.transaction_id', 'transfer_histories.transaction_id') ->where('transfer_histories.user_id', $request->user()->id) //->orWhere('transfer_histories.client_id', $request->user()->id) ->orderBy('transfers.created_at', 'desc') ->select('transfer_histories.*', 'transfers.sender_account', 'transfers.reciever_account') //->latest(); ->first(); $size = (!request()->per_page) ? 4 : request()->per_page; $withdrawals = WithdrawalsRequest::query() ->where('user_id', $request->user()->id) ->select( 'withdrawals_requests.id as id', 'withdrawals_requests.transaction_id as transaction_id', 'withdrawals_requests.account_number as account_number', DB::raw("'NULL' as account_number_sender"), 'withdrawals_requests.description as description', 'withdrawals_requests.reciever_name as name_receiver', DB::raw("withdrawals_requests.sender_name as name_sender"), 'withdrawals_requests.amount as amount', 'withdrawals_requests.imali_fee as imali_fee', 'withdrawals_requests.total as total', // DB::raw("'NULL' as client_id"), DB::raw("'NULL' as user_status"), // 'withdrawals_requests.status as status', DB::raw( "CASE WHEN withdrawals_requests.status = 'success' THEN 'Sucesso' WHEN withdrawals_requests.status = 'pending' THEN 'Pendente' WHEN withdrawals_requests.status = 'completed' THEN 'Concluído' WHEN withdrawals_requests.status = 'failed' THEN 'Falhou' ELSE withdrawals_requests.status END as status" ), 'withdrawals_requests.created_at as created_at', 'withdrawals_requests.updated_at as updated_at', DB::raw("'external' as transfer_type"), 'withdrawals_requests.user_id as sender_id', ) ->orderBy('withdrawals_requests.created_at', 'desc'); //if ($this->checkAccount($data_transfer->sender_account) || $this->checkAccount($data_transfer->reciever_account)) { if (($data_transfer->sender_account && $this->checkAccount($data_transfer->sender_account)) || ($data_transfer->reciever_account && $this->checkAccount($data_transfer->reciever_account))) { //return "estou nas subcontas"; $transfers = TransferHistory::query() ->join('transfers', 'transfers.transaction_id', '=', 'transfer_histories.transaction_id') ->join('users', 'users.id', 'transfer_histories.client_id') // ID = 2 ->join('users as sender', 'sender.id', 'transfer_histories.user_id') // ID = 4 ->where('transfer_histories.user_id', $request->user()->id) ->orderBy('transfer_histories.created_at', 'desc') ->select( 'transfer_histories.id as id', 'transfer_histories.transaction_id as transaction_id', DB::raw("CASE WHEN transfer_histories.user_status = 'payer' THEN transfers.reciever_account WHEN transfer_histories.user_status = 'receiver' THEN transfers.sender_account ELSE transfers.reciever_account END as reciever_account"), 'transfers.sender_account as account_number_sender', DB::raw("'TRF. iMali' as description"), DB::raw("CASE WHEN transfer_histories.user_status = 'payer' THEN transfers.reciever_name WHEN transfer_histories.user_status = 'receiver' THEN transfers.sender_name ELSE transfers.reciever_name END as name_receiver"), 'transfers.sender_name as name_sender', 'transfers.amount as amount', DB::raw("'0' as imali_fee"), 'transfers.amount as total', 'transfer_histories.user_status', DB::raw("CASE WHEN transfers.estado = 'Pago' THEN 'Sucesso' WHEN transfers.estado = 'Recebido' THEN 'Recebido' ELSE transfers.estado END as status"), 'transfers.created_at as created_at', 'transfers.updated_at as updated_at', DB::raw("'internal' as transfer_type"), 'transfers.sender_id as sender_id', ) ->orderBy('transfer_histories.created_at', 'desc'); $results = $withdrawals->union($transfers)->orderBy('created_at', 'desc')->paginate($size); } else { //return "entrou"; $transfers = TransferHistory::query() ->join('users', 'users.id', 'transfer_histories.client_id') // ID = 2 ->join('users as sender', 'sender.id', 'transfer_histories.user_id') // ID = 4 ->join('users as receiver', 'receiver.id', '=', 'transfer_histories.user_id') ->join('imali_accounts as imaliSender', 'imaliSender.user_id', '=', 'transfer_histories.user_id') ->join('imali_accounts as imaliReceiver', 'imaliReceiver.user_id', '=', 'transfer_histories.user_id') ->join('imali_accounts', 'imali_accounts.user_id', '=', 'transfer_histories.client_id') ->join('transfers', 'transfers.transaction_id', '=', 'transfer_histories.transaction_id') ->where('transfer_histories.user_id', $request->user()->id) ->orderBy('transfer_histories.created_at', 'desc') ->select( 'transfer_histories.id as id', 'transfer_histories.transaction_id as transaction_id', 'imali_accounts.account_number as account_number', 'imaliSender.account_number as account_number_sender', DB::raw("'TRF. iMali' as description"), 'users.name as name_receiver', 'sender.name as name_sender', 'transfers.amount as amount', DB::raw("'0' as imali_fee"), 'transfers.amount as total', 'transfer_histories.user_status', DB::raw("CASE WHEN transfers.estado = 'Pago' THEN 'Sucesso' WHEN transfers.estado = 'Recebido' THEN 'Recebido' ELSE transfers.estado END as status"), 'transfers.created_at as created_at', 'transfers.updated_at as updated_at', DB::raw("'internal' as transfer_type"), 'transfers.sender_id as sender_id', ) ->orderBy('transfer_histories.created_at', 'desc'); $results = $withdrawals->union($transfers)->orderBy('created_at', 'desc')->paginate($size); } return response()->json($results, 200); } // todo -- adicionado 15-04-24 // EXTRACT SUBACCOUNT PAYMENTS // public function subAccountExtract($subAccounNumber, $startDate = null, $endDate = null) public function subAccountExtract(Request $request) { $extract = Payment::query() ->select( 'transaction_id as TransactionID', 'created_at as Date', 'sender_card_number as Card Number', 'sender_account_number as Sender Account Number', 'transaction_name as Transaction Type', 'amount as Amount', 'old_balance as OldBalance', 'new_balance as NewBalance', 'status as Status' ) ->where('sender_account_number', $request->card_number); // ->where('created_at', '>=', $request->startDate) // ->where('created_at', '<=', $request->endDate) // ->orderByDesc('payments.created_at') // ->get(); // Adicionar filtro de datas apenas se os parâmetros estiverem presentes if ($request->startDate) { $extract->where('created_at', '>=', $request->startDate); } if ($request->endDate) { $extract->where('created_at', '<=', $request->endDate); } $extract = $extract->orderByDesc('payments.created_at')->get(); return response()->json(['data' => $extract], 200); } public function getMyVouchers(Request $request) { $size = (!request()->per_page) ? 4 : request()->per_page; $new_start_date = null; $new_end_date = null; if ($request->filled('start_date')) { $start_date = explode('-', $request->start_date); if (strlen($start_date[2]) >= 4) $new_start_date = $start_date[2] . '-' . $start_date[1] . '-' . $start_date[0]; } if ($request->filled('end_date')) { $end_date = explode('-', $request->end_date); if (strlen($end_date[2]) >= 4) $new_end_date = $end_date[2] . '-' . $end_date[1] . '-' . $end_date[0]; } $voucher = PurchaseVoucher::query() ->join('users', 'users.id', '=', 'purchase_vouchers.user_id') ->join('imali_accounts', 'imali_accounts.user_id', '=', 'purchase_vouchers.user_id') ->leftJoin('transaction_locations', 'transaction_locations.voucher_id', '=', 'purchase_vouchers.id') ->leftJoin('ramo_activities', 'ramo_activities.id', '=', 'purchase_vouchers.category_id') ->orderByDesc('purchase_vouchers.created_at') // new ------------------------ ->when($request->filled('start_date'), function ($query) use ($request, $new_start_date) { $query->whereDate('purchase_vouchers.created_at', '>=', $new_start_date ?? $request->start_date); }) ->when($request->filled('end_date'), function ($query) use ($request, $new_end_date) { $query->whereDate('purchase_vouchers.created_at', '<=', $new_end_date ?? $request->end_date); }) // new ------------------------ ->where('purchase_vouchers.user_id', $request->user()->id) ->select( 'purchase_vouchers.*', 'imali_accounts.account_number', 'users.name', 'users.last_name', 'transaction_locations.longitude', 'transaction_locations.latitude', 'transaction_locations.country_name', 'transaction_locations.country_code', 'transaction_locations.admin_area', 'transaction_locations.sub_admin_area', 'ramo_activities.nome as category' ) // ->get(); ->paginate($size); return response()->json($voucher, 200); //return response()->json(['data' => $voucher], 200); } public function checkReceiver(Request $request) { $imaliAccountReceiver = ImaliAccount::query()->where('account_number', $request->account_number)->first(); if ($imaliAccountReceiver) { $log = new Record(); $log->createLog([ 'description' => $request->account_number, 'details' => 'Conta Verificada com sucesso', 'operation' => 'Check Receiver or Client', 'properties' => json_encode($request->all()), 'status' => 'Success', 'user_id' => $request->user()->id ]); return response()->json(['message' => 'Conta existente'], 200); } else { $log = new Record(); $log->createLog([ 'description' => $request->account_number, 'details' => 'Conta i.Mali inválida', 'operation' => 'Check Receiver or Client', // 'properties' => $request->all(), 'properties' => json_encode($request->all()), 'status' => 'Error', 'user_id' => $request->user()->id ]); return response()->json(['message' => 'Conta i.Mali inválida'], 404); } } // public function pushNotifification($token, $notification = array(), $data = array()) // { // $apiKey = 'AAAA8zVzEPQ:APA91bHl_DXB6UGb_6gZlmFnaLTQoANtX_OBjvl3nOy2bSlnFhxedvk6EhGj7cZoIvmlbKeCnqGxXbuyMH_rEPuhRXvuitXzo6Pfl2TMXLar1PlifXqEhYq6tS55UMrY2Kffzj-P_UH-'; // $fields = array('to' => $token, 'notification' => $notification, 'data' => $data); // $headers = array('Authorization: key=' . $apiKey, 'Content-Type: application/json'); // $url = 'https://fcm.googleapis.com/fcm/send'; // $curl = curl_init(); // curl_setopt($curl, CURLOPT_URL, $url); // curl_setopt($curl, CURLOPT_POST, true); // curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); // curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($fields)); // $result = curl_exec($curl); // curl_close($curl); // return json_decode($result, true); // } private function getAccessToken() { $client = new GoogleClient(); // $client->setAuthConfig(storage_path('app/imaliapp-5155e-firebase-adminsdk-gv3wp-2713d42c5b.json')); // Caminho do arquivo JSON da conta de serviço $client->setAuthConfig($this->getFirebaseAuthConf()); // Caminho do arquivo JSON da conta de serviço $client->addScope($_ENV['FIREBASE_MESSAGE_SCOPE']); $client->setAccessType('offline'); $token = $client->fetchAccessTokenWithAssertion(); return $token['access_token']; } private function getFirebaseAuthConf() { return [ "type" => $_ENV['TYPE'], "project_id" => $_ENV['PROJECT_ID'], "private_key_id" => $_ENV['PRIVATE_KEY_ID'], "private_key" => $_ENV['PRIVATE_KEY'], "client_email" => $_ENV['CLIENT_EMAIL'], "client_id" => $_ENV['CLIENT_ID'], "auth_uri" => $_ENV['AUTH_URI'], "token_uri" => $_ENV['TOKEN_URI'], "auth_provider_x509_cert_url" => $_ENV['AUTH_PROVIDER_X509_CERT_URL'], "client_x509_cert_url" => $_ENV['CLIENT_X509_CERT_URL'], "universe_domain" => $_ENV['UNIVERSE_DOMAIN'] ]; } public function pushNotifification($token, $notification = array(), $data = array()) { $fields = [ 'message' => [ 'token' => $token, 'android' => [ 'notification' => $notification ], "apns" => [ "payload" => [ "aps" => [ "category" => "NEW_MESSAGE_CATEGORY" ] ] ], 'data' => $this->convert_array_values_to_string($data) ?? [], ] ]; $headers = array('Authorization: Bearer ' . $this->getAccessToken(), 'Content-Type: application/json'); $url = $_ENV['FIREBASE_NEW_URL']; $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); } private function convert_array_values_to_string($array) { return array_map(function ($value) { return (string) $value; // Convert each value to a string }, array_combine(array_map('strval', array_keys($array)), $array)); } // get All transactions TRANSFER | PAYMENT | VOUCHERS (recargas) tv, withdrawall, agua, credelec, // TODO -- 15-Setembro-2024 public function getAllTransactionData(Request $request) { $allTransac = AllTransaction::query()->orderBy('id', 'desc')->get(); if ($allTransac->isEmpty()) { return response()->json(['data' => []], 200); } return response()->json(['data' => $allTransac], 200); } // Create Payment Link public function paymentLink(Request $request) { $this->validate( $request, [ 'title' => 'required', 'store_id' => 'required|numeric', 'amount' => 'required|numeric', 'short_description' => 'required', // 'send_to_phone' => 'required', 'customer_link_id' => 'nullable|unique:links,customer_link_id', 'type' => 'required|in:RECURRING,DIRECT,DONATION', // 'expiration_datetime' => 'nullable|date_format:Y-m-d H:i:s', 'expiration_datetime' => 'required_if:type,DONATION|nullable|date_format:Y-m-d H:i:s', 'thumbnail_image' => 'mimes:jpeg,jpg,png|max:4096', 'payment_frequence' => 'required_if:type,RECURRING|in:DAILY,WEEKLY,MONTHLY,YEARLY', ], [ 'title.required' => 'Campo title é obrigatório', 'store_id.required' => 'Campo store_id é obrigatório', 'store_id.numeric' => 'Campo store_id é numerico', 'amount.required' => 'Campo amount é obrigatório', 'amount.numeric' => 'Campo amount é numerico', 'short_description.required' => 'Campo short_description é obrigatório', // 'send_to_phone.required' => 'Campo send_to_phone é obrigatório', 'customer_link_id.unique' => 'O campo customer_link_id já está em uso.', 'type.required' => 'Campo type é obrigatório', 'type.in' => 'Campo type somente permite RECURRING, DIRECT ou DONATION', 'expiration_datetime.date_format' => 'O expiration_datetime deve estar no formato Y-m-d H:i:s', 'expiration_datetime.required_if' => 'Campo expiration_datetime é obrigatório quando o tipo for DONATION', 'thumbnail_image.mimes' => 'Formato de imagem invalido, formatos permitidos jpeg,jpg,png', 'thumbnail_image.max' => 'O tamanho de imagem permitido somente abaixo de 4 MB', 'payment_frequence.required_if' => 'Campo payment_frequence é obrigatório', ] ); if ($request->has('send_to_phone') && $request->send_to_phone) { $this->validate( $request, [ 'send_to_phone' => 'required', ], [ 'send_to_phone.required' => 'Campo send_to_phone é obrigatório', ] ); } if ($request->has('expiration_datetime') && $request->expiration_datetime) { $expiration_date = (int)strtotime($request->expiration_datetime); $current_date = (int)strtotime(date('Y-m-d H:i:s')); if ($current_date > $expiration_date) return SendResponse::errorResp400('Data invalida', 'Invalid Date'); } // Se o comerciante nao enviar o expiration_datetime a API por default adiciona + um dia de duracao do link if (!$request->has('expiration_datetime')) { $duration = new DateTime(); // Data atual $duration->modify('+24 hours'); $request->request->add(['expiration_datetime' => $duration->format('Y-m-d H:i:s')]); } // adicionar o if ($request->has('payment_frequence')) { $payment_frequence = $request->payment_frequence; $current_date = now(); // Data atual switch ($payment_frequence) { case 'DAILY': # code... $current_date->modify('+24 hours')->format('Y-m-d H:i:s'); break; case 'WEEKLY': // Adiciona 7 dias à data atual $current_date->modify('+7 days')->format('Y-m-d H:i:s'); break; case 'MONTHLY': // Adiciona 1 mês à data atual $current_date->modify('+1 month')->format('Y-m-d H:i:s'); break; case 'YEARLY': // Adiciona 1 ano à data atual $current_date->modify('+1 year')->format('Y-m-d H:i:s'); break; default: return null; break; } $request->request->add(['next_payment_date' => $current_date->format('Y-m-d H:i:s')]); // return $current_date->format('Y-m-d H:i:s'); } $img_exists = $request->has('thumbnail_image') && $request->thumbnail_image; $store = Store::getStoreContractsAndConfigs($request->store_id); if (!$store) return response()->json(['message' => 'Loja inválida'], 404); // Verificar o thumbnail_image se esta preenchido if ($img_exists) { $image = new ImageUploader('links'); $image_thumbnail = $image->generateImageUrlName($request, 'thumbnail_image'); // $image_thumbnail = substr($image_thumbnail_url, 50, strlen($image_thumbnail_url)); } else { $image_thumbnail = substr($store->logo, strrpos($store->logo, '/') + 1, strlen($store->logo)); } $trasactionGeneration = new TransactionGeneration(); $transaction = $trasactionGeneration->generateTransaction(); // return $request->store_id; $imali_fee = $request->amount * ($store->taxa / 100); $amount_to_credit = $request->amount - $imali_fee; // 27 - Jan -25 $is_recurring = $request->type == 'RECURRING' ? true : false; if ($request->type == 'DONATION' && !$request->filled('expiration_datetime')) { return SendResponse::errorResp400('Campo expiration_datetime é obrigatório para o tipo DONATION', 'Missing expiration_datetime'); } $createLink = Link::create([ 'link_id' => $transaction, 'customer_link_id' => $request->customer_link_id, 'return_success_link' => $request->return_success_link, 'return_error_link' => $request->return_error_link, 'partner_transaction_id' => $request->partner_transaction_id, 'send_to_phone' => $request->send_to_phone ?? NULL, 'title' => $request->title, 'amount' => $request->amount, 'imali_fee' => $imali_fee, 'amount_to_credit' => $amount_to_credit, 'short_description' => $request->short_description, 'type' => $request->type, 'status' => $request->type == 'DIRECT' ? 'PENDING' : 'ACTIVE', 'store_id' => $request->store_id, 'business_account_id' => $store->business_account_id, // 'thumbnail_image' => $img_exists ? substr($image_thumbnail, 39, strlen($image_thumbnail)) : substr($store->logo, 56, strlen($store->logo)), // 'thumbnail_image' => $img_exists ? $image_thumbnail : substr($store->logo, 56, strlen($store->logo)), // 'thumbnail_image' => $img_exists ? $image_thumbnail : substr($store->logo, strpos($store->logo, 'logo/') + 5, strlen($store->logo)), 'thumbnail_image' => $image_thumbnail, 'thumbnail_location' => $img_exists ? 'LINKS' : 'COMERCIANTE_LOGO', // 'expiration_datetime' => $request->expiration_datetime, 'expiration_datetime' => $is_recurring ? null : $request->expiration_datetime, 'payment_frequence' => $is_recurring ? $request->payment_frequence : null, 'next_payment_date' => $is_recurring ? $request->next_payment_date : null ]); // todo -- send SMS if ($request->has('send_to_phone') && $request->send_to_phone) { $login = new LoginController; $login->resendCode(new Request(['phone' => $request->send_to_phone, 'codigo' => $_ENV['PAYMENT_LINK_URL'] . $transaction])); } // return $createLink; return response()->json(['data' => $createLink], 200); } // update link public function updateLinkIIIII(Request $request) { // Validar imagem $this->validate( $request, [ 'link_id' => 'required', 'amount' => 'required', 'type' => 'in:RECURRING,DIRECT,DONATION', 'thumbnail_image' => 'mimes:jpeg,jpg,png|max:4096', 'payment_frequence' => 'required_if:type,RECURRING|in:DAILY,WEEKLY,MONTHLY,YEARLY', ], [ 'link_id.required' => 'O campo link_id é obrigatório', 'amount.required' => 'O campo amount é obrigatório', 'type.in' => 'Campo type somente permite RECURRING, DIRECT ou DONATION', 'thumbnail_image.mimes' => 'Formato de imagem invalido, formatos permitidos jpeg,jpg,png', 'thumbnail_image.max' => 'O tamanho de imagem permitido somente abaixo de 4 MB', 'payment_frequence.required_if' => 'Campo payment_frequence é obrigatório', ] ); $user = Link::query()->where('link_id', $request->link_id)->first(); if (!$user) return response()->json(['message' => 'Link fornecido nao existe.'], 409); return $user; $store = Store::getStoreContractsAndConfigs($user->store_id); if (!$store) return response()->json(['message' => 'Loja inválida'], 404); if ($request->has('payment_frequence')) { $payment_frequence = $request->payment_frequence; $current_date = now(); // Data atual switch ($payment_frequence) { case 'DAILY': # code... $current_date->modify('+24 hours')->format('Y-m-d H:i:s'); break; case 'WEEKLY': // Adiciona 7 dias à data atual $current_date->modify('+7 days')->format('Y-m-d H:i:s'); break; case 'MONTHLY': // Adiciona 1 mês à data atual $current_date->modify('+1 month')->format('Y-m-d H:i:s'); break; case 'YEARLY': // Adiciona 1 ano à data atual $current_date->modify('+1 year')->format('Y-m-d H:i:s'); break; default: return null; break; } $request->request->add(['next_payment_date' => $current_date->format('Y-m-d H:i:s')]); // return $current_date->format('Y-m-d H:i:s'); } $img_exists = $request->has('thumbnail_image') && $request->thumbnail_image; if ($img_exists) { $image = new ImageUploader('links'); $image_thumbnail = $image->generateImageUrlName($request, 'thumbnail_image'); } else { $image_thumbnail = substr($store->logo, strrpos($store->logo, '/') + 1, strlen($store->logo)); } $is_recurring = $request->type == 'RECURRING' ? true : false; if ($user) { $imali_fee = $request->amount * ($store->taxa / 100); $amount_to_credit = $request->amount - $imali_fee; $update = Link::query() ->update([ 'amount' => $request->amount, 'imali_fee' => $imali_fee, 'amount_to_credit' => $amount_to_credit, 'type' => $request->type, 'thumbnail_image' => $image_thumbnail, 'payment_frequence' => $is_recurring ? $request->payment_frequence : null, 'next_payment_date' => $is_recurring ? $request->next_payment_date : null ]); if ($update) { return response()->json(['message' => 'Dados actualizados com sucesso.'], 200); } } return $user; } public function updateLink(Request $request) { $this->validate( $request, [ 'link_id' => 'required', 'amount' => 'required|numeric', 'type' => 'required|in:RECURRING,DIRECT,DONATION', 'thumbnail_image' => 'nullable|mimes:jpeg,jpg,png|max:4096', 'payment_frequence' => 'required_if:type,RECURRING|in:DAILY,WEEKLY,MONTHLY,YEARLY', ], [ 'link_id.required' => 'O campo link_id é obrigatório', 'amount.required' => 'O campo amount é obrigatório', 'type.in' => 'Campo type somente permite RECURRING, DIRECT ou DONATION', 'thumbnail_image.mimes' => 'Formato de imagem inválido. Permitido: jpeg, jpg, png.', 'thumbnail_image.max' => 'O tamanho da imagem deve ser menor que 4 MB.', 'payment_frequence.required_if' => 'Campo payment_frequence é obrigatório para tipo RECURRING.', ] ); $link = Link::where('link_id', $request->link_id)->first(); return $link; if (!$link) { return response()->json(['message' => 'Link fornecido não existe.'], 409); } $store = Store::getStoreContractsAndConfigs($link->store_id); if (!$store) { return response()->json(['message' => 'Loja inválida.'], 404); } // Calcular next_payment_date se for recorrente $next_payment_date = null; if ($request->type === 'RECURRING' && $request->filled('payment_frequence')) { $now = now(); switch ($request->payment_frequence) { case 'DAILY': $next_payment_date = $now->addDay(); break; case 'WEEKLY': $next_payment_date = $now->addWeek(); break; case 'MONTHLY': $next_payment_date = $now->addMonth(); break; case 'YEARLY': $next_payment_date = $now->addYear(); break; } } // Processar imagem if ($request->hasFile('thumbnail_image')) { $image = new ImageUploader('links'); $image_thumbnail = $image->generateImageUrlName($request, 'thumbnail_image'); } else { $image_thumbnail = basename($store->logo); } // Calcular taxas $imali_fee = $request->amount * ($store->taxa / 100); $amount_to_credit = $request->amount - $imali_fee; // Actualizar os dados $link->update([ 'amount' => $request->amount, 'imali_fee' => $imali_fee, 'amount_to_credit' => $amount_to_credit, 'type' => $request->type, 'thumbnail_image' => $image_thumbnail, 'payment_frequence' => $request->type === 'RECURRING' ? $request->payment_frequence : null, 'next_payment_date' => $request->type === 'RECURRING' ? $next_payment_date : null, ]); return response()->json(['message' => 'Dados actualizados com sucesso.'], 200); } public function getStorePaymentLink($store_account) { $store = Store::getStoreContractsAndConfigs($store_account); if (!$store) return response()->json(['message' => 'Loja inválida'], 400); // $store_links = Link::query() // ->join('stores', 'stores.id', 'links.store_id') // ->where('links.store_id', $store->id) // ->get(); $store_links = Link::query() ->join('stores', 'stores.id', 'links.store_id') ->select( 'links.id', 'links.link_id', 'links.customer_link_id', 'links.send_to_phone', 'links.title', 'links.amount', 'links.short_description', 'links.amount_to_credit', 'links.expiration_datetime', 'links.status', 'links.thumbnail_image', 'stores.name', 'links.created_at', ) ->where('links.store_id', $store->id) ->get(); return response()->json(['data' => $store_links], 200); } // Get Link by link_id or customer_link_id public function getStoreLink($link) { $store_links = Link::query() // ->join('business_accounts', 'business_accounts.id', 'links.business_account_id') ->join('stores', 'stores.id', 'links.store_id') // ->select('links.*', 'business_accounts.name as merchant_name', 'business_accounts.account_number as business_account_number') ->select('links.*', 'stores.name as store_name', 'stores.account_number as store_account_number', 'stores.logo') ->where('link_id', $link) ->orWhere('customer_link_id', $link) ->first(); if ($store_links) $this->checkExpiredLink($store_links); // return response()->json($store_links, 200); return response()->json(['data' => array($store_links)], 200); } }