diff --git a/app/Http/Controllers/HelperController.php b/app/Http/Controllers/HelperController.php index 0621300..24d07cc 100755 --- a/app/Http/Controllers/HelperController.php +++ b/app/Http/Controllers/HelperController.php @@ -31,7 +31,7 @@ class HelperController extends Controller { $networks = DB::select('SELECT n.id , n.name , c.type FROM networks n INNER JOIN configWallet c ON c.id_network = n.id WHERE n.id IN ( SELECT distinct id_network FROM paying_networks ) AND status = 1 AND country_id = :id;',['id'=>$id_country]); - foreach ($networks as$network){ + foreach ($networks as $network){ if($network->type == 'ilink') $network->type = 'ilink-world'; } diff --git a/app/Http/Controllers/iLinkTransactionController.php b/app/Http/Controllers/iLinkTransactionController.php index cec7415..4c6e453 100755 --- a/app/Http/Controllers/iLinkTransactionController.php +++ b/app/Http/Controllers/iLinkTransactionController.php @@ -113,64 +113,113 @@ class iLinkTransactionController extends Controller $walletUser = WalletsUser::findOrFail($request->id_wallet_user); $user = User::findOrFail($walletUser->idUser); if ($this->checkPassword($request->password, $user->encrypted_password, $user->salt)) { - $transaction->frais = $frais = ($request->init_country != $request->final_country) ? $this->calculateFees($plr_user_wallet_wallet, $request->montant) : $this->calculateFees($plr_user_wallet_wallet_national, $request->montant); - $transaction->taxe = $taxe = ($request->init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais); - $transaction->montant_depot = $montantDepot = $transaction->montant - $frais - $taxe; - $configPayeur = ConfigWallet::where('id_network', $request->network_destinataire)->firstOrFail(); - $reseauPayeur = PayingNetwork::where('id_network', $request->network_destinataire)->where('id_configWallet', $config->id)->firstOrFail(); - if($request->init_country != $request->final_country){ - $transaction->part_reseau_payeur = $frais * $reseauPayeur->taux_partage / 100; - $transaction->part_reseau_emetteur = $frais - $transaction->part_reseau_payeur; + if($request->montant > $walletUser->balance){ + return $this->errorResponse(trans('errors.insufficient_balance')); }else{ - $transaction->part_reseau_payeur = 0; - $transaction->part_reseau_emetteur = $frais; - } - $transaction->commission_hyp = $transaction->part_reseau_emetteur; - $reseauPayeur->balance_com += $transaction->part_reseau_payeur; - if ($configPayeur->type == 'ilink') { - $walletHyperviseur->balance_com += $transaction->part_reseau_emetteur; - $destinataire = User::where('user_code', $request->id_destinataire)->first(); - if($destinataire) { // Si c'est un wallet ilink - $walletDestinataire = WalletsUser::where('idUser', $destinataire->id)->firstOrFail(); - $walletDestinataire->balance += $montantDepot; - $walletDestinataire->save(); - } else { - return $this->errorResponse(trans('errors.wallet_not_defined')); - } - $walletUser->balance -= $transaction->montant; - //Hyperviseur payeur - $hyperviseurPayeur = AgentPlus::where('category', 'hyper')->where('network_id', $request->network_destinataire)->firstOrFail(); - if($hyperviseurPayeur->id == $hyperviseur->id){ //Si c'est le reseau payeur est aussi emetteur - $walletHyperviseur->balance_com += $transaction->part_reseau_payeur; - $reseauPayeur->balance_com += $transaction->part_reseau_emetteur; + $transaction->frais = $frais = ($request->init_country != $request->final_country) ? $this->calculateFees($plr_user_wallet_wallet, $request->montant) : $this->calculateFees($plr_user_wallet_wallet_national, $request->montant); + $transaction->taxe = $taxe = ($request->init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais); + $transaction->montant_depot = $montantDepot = $transaction->montant - $frais - $taxe; + $configPayeur = ConfigWallet::where('id_network', $request->network_destinataire)->firstOrFail(); + $reseauPayeur = PayingNetwork::where('id_network', $request->network_destinataire)->where('id_configWallet', $config->id)->firstOrFail(); + if($request->init_country != $request->final_country){ + $transaction->part_reseau_payeur = $frais * $reseauPayeur->taux_partage / 100; + $transaction->part_reseau_emetteur = $frais - $transaction->part_reseau_payeur; }else{ - $wallet_agent_hypPayeur = WalletAgent::where('agent_id', $hyperviseurPayeur->id)->firstOrFail(); - $walletHyperviseurPayeur = Wallet::findOrFail($wallet_agent_hypPayeur->wallet_id); - $walletHyperviseurPayeur->balance_com += $transaction->part_reseau_payeur; - $walletHyperviseurPayeur->save(); + $transaction->part_reseau_payeur = 0; + $transaction->part_reseau_emetteur = $frais; } - $walletHyperviseur->save(); - $walletUser->save(); - } else { - //Emettre requete SSL vers wallet extene correspondant pour recharger le compte dont l'id est : + $transaction->commission_hyp = $transaction->part_reseau_emetteur; + $reseauPayeur->balance_com += $transaction->part_reseau_payeur; + if ($configPayeur->type == 'ilink') { + $walletHyperviseur->balance_com += $transaction->part_reseau_emetteur; + $destinataire = User::where('user_code', $request->id_destinataire)->first(); + if($destinataire) { // Si c'est un wallet ilink + $walletDestinataire = WalletsUser::where('idUser', $destinataire->id)->firstOrFail(); + $walletDestinataire->balance += $montantDepot; + $walletDestinataire->save(); + } else { + return $this->errorResponse(trans('errors.wallet_not_defined')); + } + $walletUser->balance -= $transaction->montant; + //Hyperviseur payeur + $hyperviseurPayeur = AgentPlus::where('category', 'hyper')->where('network_id', $request->network_destinataire)->firstOrFail(); + if($hyperviseurPayeur->id == $hyperviseur->id){ //Si c'est le reseau payeur est aussi emetteur + $walletHyperviseur->balance_com += $transaction->part_reseau_payeur; + $reseauPayeur->balance_com += $transaction->part_reseau_emetteur; + }else{ + $wallet_agent_hypPayeur = WalletAgent::where('agent_id', $hyperviseurPayeur->id)->firstOrFail(); + $walletHyperviseurPayeur = Wallet::findOrFail($wallet_agent_hypPayeur->wallet_id); + $walletHyperviseurPayeur->balance_com += $transaction->part_reseau_payeur; + $walletHyperviseurPayeur->save(); + } + $walletHyperviseur->save(); + $walletUser->save(); + } else { + //Emettre requete SSL vers wallet extene correspondant pour recharger le compte dont l'id est : // $transaction->id_destinataire ; - // et le montant est: + // et le montant est: // $montantDepot; + } + $reseauPayeur->save(); + $transaction->save(); + $this->sendMail($user->email, trans('messages.successful_transaction'), trans('messages.successful_user_send_to_wallet', + ['id_transaction' => $transaction->id, 'amount' => $this->toMoney($transaction->montant, $request->init_country), 'net_init' => $this->toMoney($montantDepot, $request->init_country), + 'net_final' => $this->convertMoney($montantDepot, $request->init_country, $request->final_country), 'fees' => $this->toMoney($frais + $taxe, $request->init_country), + 'init_country'=>$this->getCountryName($request->init_country) , 'final_country'=>$this->getCountryName($request->final_country), + 'sender_code' => $user->user_code, 'receiver_code' => $transaction->id_destinataire])); + return $this->successResponse(trans('messages.successful_transaction')); } - $reseauPayeur->save(); - $transaction->save(); - $this->sendMail($user->email, trans('messages.successful_transaction'), trans('messages.successful_user_send_to_wallet', - ['id_transaction' => $transaction->id, 'amount' => $this->toMoney($transaction->montant, $request->init_country), 'net_init' => $this->toMoney($montantDepot, $request->init_country), - 'net_final' => $this->convertMoney($montantDepot, $request->init_country, $request->final_country), 'fees' => $this->toMoney($frais + $taxe, $request->init_country), - 'init_country'=>$this->getCountryName($request->init_country) , 'final_country'=>$this->getCountryName($request->final_country), - 'sender_code' => $user->user_code, 'receiver_code' => $transaction->id_destinataire])); - return $this->successResponse(trans('messages.successful_transaction')); } else { return $this->errorResponse(trans('messages.incorrect_user_password')); } break; case 2: //User - Envoi de wallet à carte + $this->validate($request, $transaction->card_rules()); + $walletUser = WalletsUser::findOrFail($request->id_wallet_user); + $user = User::findOrFail($walletUser->idUser); + if ($this->checkPassword($request->password, $user->encrypted_password, $user->salt)) { + if ($request->montant > $walletUser->balance) { + return $this->errorResponse(trans('errors.insufficient_balance')); + } else { + $expiration_date = \DateTime::createFromFormat('m/y', $request->expiration_date); + if (!$expiration_date) + $expiration_date = new \DateTime(); + $transaction->expiration_date = $expiration_date; + $frais = $request->montant * $config->taux_com_user_wallet_carte / 100; + $transaction->montant_depot = $montantDepot = $transaction->montant - $frais; + $body['amount'] = $montantDepot; + $body['card_number'] = $request->numero_carte; + $body['cvv'] = $request->cvv; + $body['expiry_date'] = $expiration_date->format('Y-m'); + + $response = $client->post('fund-transfer-api/v1/transaction/push', ['json' => $body]); + $code = $response->getStatusCode(); + + if ($code == 200) { + $walletUser->balance -= $transaction->montant; + + $walletHyperviseur->balance_com += $frais; + $transaction->commission_hyp = $frais; + $transaction->id_wallet_hyp = $walletHyperviseur->id; + $transaction->frais = $frais; + $transaction->date = new \DateTime(); + $walletHyperviseur->save(); + $walletUser->save(); + $transaction->save(); + $this->sendMail($user->email, trans('messages.successful_transaction'), trans('messages.successful_user_send_to_cart', + ['id_transaction' => $transaction->id, 'amount' => $this->toMoneyWithNetwork($transaction->montant, $request->id_network), + 'net' => $this->toMoneyWithNetwork($montantDepot, $request->id_network), 'fees' => $this->toMoneyWithNetwork($frais, $request->id_network), + 'sender_code' => $user->user_code, 'cart_number' => wordwrap($request->numero_carte, 4, ' ', true)])); + return $this->successResponse(trans('messages.successful_transaction')); + + } else { + return $this->errorResponse(trans('errors.visa_api_failed'), Response::HTTP_INTERNAL_SERVER_ERROR); + } + } + }else{ + return $this->errorResponse(trans('messages.incorrect_user_password')); + } break; case 3: //User - Envoi de wallet à cash diff --git a/app/Traits/Helper.php b/app/Traits/Helper.php index a3d2e6b..e2473f4 100644 --- a/app/Traits/Helper.php +++ b/app/Traits/Helper.php @@ -13,6 +13,7 @@ use Brick\Money\ExchangeRateProvider\BaseCurrencyProvider; use Brick\Money\Money; use Brick\Math\RoundingMode; use PDO; +use Illuminate\Support\Facades\DB; trait Helper { @@ -46,6 +47,14 @@ trait Helper return Country::findOrFail($id_country)->name; } + public function toMoneyWithNetwork($amount , $id_network){ + $currency = collect(DB::select('SELECT cu.code FROM networks n INNER JOIN countries c ON c.id = n.country_id INNER JOIN currencies cu ON cu.id = c.idCurrency + WHERE n.id = :id',['id'=>$id_network]))->first(); + + $money = Money::of(round($amount, 0),$currency ? $currency->code : 'XAF'); + return $money->formatTo('fr_FR'); + } + public function toMoney($amount, $id_country) { $country = Country::findOrFail($id_country); diff --git a/resources/lang/en/errors.php b/resources/lang/en/errors.php index 9e683d8..106a0c2 100755 --- a/resources/lang/en/errors.php +++ b/resources/lang/en/errors.php @@ -9,5 +9,6 @@ return [ 'visa_api_failed'=> 'Request to API visa failed', 'failed_transaction' => 'Failed transaction', 'user_phone_not_exist' => 'This customer number does not exist', - 'wallet_not_defined' => 'This code does not correspond to an iLink wallet' + 'wallet_not_defined' => 'This code does not correspond to an iLink wallet', + 'insufficient_balance'=> 'The balance is insufficient to complete this transaction', ]; diff --git a/resources/lang/en/messages.php b/resources/lang/en/messages.php index 87c1ee9..60537a6 100755 --- a/resources/lang/en/messages.php +++ b/resources/lang/en/messages.php @@ -56,4 +56,12 @@ Transaction information: - Fees + Tax : :fees - Number of the sending wallet: :sender_code - Number of the recipient wallet: :receiver_code', + 'successful_user_send_to_cart' => 'Sending money to a visa card made. +Transaction information: + - Transaction ID: :id_transaction + - Amount of the transaction: :amount + - Net shipping amount: :net + - Fees: :fees + - Number of the sending wallet: :sender_code + - Recipient\'s card number: :cart_number', ]; diff --git a/resources/lang/fr/errors.php b/resources/lang/fr/errors.php index 3c2ea58..64f96f4 100755 --- a/resources/lang/fr/errors.php +++ b/resources/lang/fr/errors.php @@ -9,5 +9,6 @@ return [ 'visa_api_failed'=> 'La requete vers l\'api visa a échouée', 'failed_transaction' => 'Transaction échouée', 'user_phone_not_exist' => 'Ce numéro client n\'existe pas', - 'wallet_not_defined' => 'Ce code ne correspond pas à un wallet iLink' + 'wallet_not_defined' => 'Ce code ne correspond pas à un wallet iLink', + 'insufficient_balance'=> 'Le solde est insuffisant pour effectuer cette transaction', ]; diff --git a/resources/lang/fr/messages.php b/resources/lang/fr/messages.php index 238c61a..e2ba9ff 100755 --- a/resources/lang/fr/messages.php +++ b/resources/lang/fr/messages.php @@ -56,4 +56,12 @@ Informations de la transaction : - Frais et Taxe : :fees - Numero du wallet émetteur : :sender_code - Numero du wallet destinataire : :receiver_code', + 'successful_user_send_to_cart' => 'Envoi d\'argent vers une carte visa effectué. +Informations de la transaction : + - Transaction ID : :id_transaction + - Montant de la transaction : :amount + - Montant net d\'envoi: :net + - Frais : :fees + - Numero du wallet émetteur : :sender_code + - Numero de la carte du destinataire : :cart_number', ];