diff --git a/app/Http/Controllers/iLinkTransactionController.php b/app/Http/Controllers/iLinkTransactionController.php index 4c6e453..a2bfe28 100755 --- a/app/Http/Controllers/iLinkTransactionController.php +++ b/app/Http/Controllers/iLinkTransactionController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers; use App\Models\AgentPlus; use App\Models\CodeGenerer; use App\Models\ConfigWallet; +use App\Models\Country; use App\Models\NetworksAgent; use App\Models\PayingNetwork; use App\Models\TypeIlinkTransaction; @@ -44,7 +45,6 @@ class iLinkTransactionController extends Controller 'type' => 'required|integer|min:0|not_in:0', 'id_wallet_agent' => 'required_without:id_wallet_user|integer|min:0|not_in:0', 'id_wallet_user' => 'required_without:id_wallet_agent|integer|min:0|not_in:0', - 'id_network' => 'required_with:id_wallet_user|integer|min:0|not_in:0', 'password' => 'required', 'montant' => 'required|numeric|min:0|not_in:0', ]); @@ -66,9 +66,19 @@ class iLinkTransactionController extends Controller $walletSuperviseur = Wallet::findOrFail($wallet_agent_sup->wallet_id); $walletHyperviseur = Wallet::findOrFail($wallet_agent_hyp->wallet_id); } elseif (isset($request->id_wallet_user)) { - $config = ConfigWallet::where('id_network', $request->id_network)->firstOrFail(); + $walletUser = WalletsUser::findOrFail($request->id_wallet_user); + $transaction->init_country = $init_country = $walletUser->user->network->country->id; + $result = ConfigWallet::join('networks', 'networks.id', '=', 'configWallet.id_network') + ->where('networks.country_id', $init_country)->where('configWallet.type', 'ilink') + ->select('configWallet.id')->first(); + if ($result) { + $config = ConfigWallet::findOrFail($result->id); + $transaction->network_emetteur = $config->id_network; + } else { + return $this->errorResponse(trans('errors.no_ilink_network')); + } - $hyperviseur = AgentPlus::where('category', 'hyper')->where('network_id', $request->id_network)->firstOrFail(); + $hyperviseur = AgentPlus::where('category', 'hyper')->where('network_id', $config->id_network)->firstOrFail(); $wallet_agent_hyp = WalletAgent::where('agent_id', $hyperviseur->id)->firstOrFail(); $walletHyperviseur = Wallet::findOrFail($wallet_agent_hyp->wallet_id); } @@ -110,43 +120,48 @@ class iLinkTransactionController extends Controller switch ($type->id) { case 1: //User - Envoi wallet à wallet $this->validate($request, $transaction->send_wallet_wallet_rules()); - $walletUser = WalletsUser::findOrFail($request->id_wallet_user); - $user = User::findOrFail($walletUser->idUser); + $user = $walletUser->user; if ($this->checkPassword($request->password, $user->encrypted_password, $user->salt)) { - if($request->montant > $walletUser->balance){ + if ($request->montant > $walletUser->balance) { return $this->errorResponse(trans('errors.insufficient_balance')); - }else{ - $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); + } else { + $transaction->frais = $frais = ($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 = ($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){ + if ($init_country != $request->final_country) { $transaction->part_reseau_payeur = $frais * $reseauPayeur->taux_partage / 100; $transaction->part_reseau_emetteur = $frais - $transaction->part_reseau_payeur; - }else{ + } 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(); + if ($destinataire) { // Si c'est un wallet ilink + if ($destinataire->network->country->id == $request->final_country) { + $walletDestinataire = WalletsUser::where('idUser', $destinataire->id)->firstOrFail(); + $walletDestinataire->balance += $montantDepot; + $walletDestinataire->save(); + } else { + $country = Country::findOrFail($request->final_country); + return $this->errorResponse(trans('errors.wallet_country_not_match', ['country' => $country->name])); + } } else { return $this->errorResponse(trans('errors.wallet_not_defined')); } + $walletHyperviseur->balance_com += $transaction->part_reseau_emetteur; $walletUser->balance -= $transaction->montant; + $transaction->id_wallet_hyp = $walletHyperviseur->id; //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 + $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{ + } 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; @@ -163,9 +178,9 @@ class iLinkTransactionController extends Controller $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), + ['id_transaction' => $transaction->id, 'amount' => $this->toMoney($transaction->montant, $init_country), 'net_init' => $this->toMoney($montantDepot, $init_country), + 'net_final' => $this->convertMoney($montantDepot, $init_country, $request->final_country), 'fees' => $this->toMoney($frais + $taxe, $init_country), + 'init_country' => $this->getCountryName($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')); } @@ -175,8 +190,7 @@ class iLinkTransactionController extends Controller 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); + $user = $walletUser->user; if ($this->checkPassword($request->password, $user->encrypted_password, $user->salt)) { if ($request->montant > $walletUser->balance) { return $this->errorResponse(trans('errors.insufficient_balance')); @@ -208,8 +222,8 @@ class iLinkTransactionController extends Controller $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), + ['id_transaction' => $transaction->id, 'amount' => $this->toMoney($transaction->montant, $init_country), + 'net' => $this->toMoney($montantDepot, $init_country), 'fees' => $this->toMoney($frais, $init_country), 'sender_code' => $user->user_code, 'cart_number' => wordwrap($request->numero_carte, 4, ' ', true)])); return $this->successResponse(trans('messages.successful_transaction')); @@ -217,7 +231,7 @@ class iLinkTransactionController extends Controller return $this->errorResponse(trans('errors.visa_api_failed'), Response::HTTP_INTERNAL_SERVER_ERROR); } } - }else{ + } else { return $this->errorResponse(trans('messages.incorrect_user_password')); } break; @@ -535,40 +549,108 @@ class iLinkTransactionController extends Controller } - public function lastTransactions($id_wallet) + public function lastUserTransactions($id_wallet_user) { - $transactions = WalletTransaction::where('id_wallet', $id_wallet)->orderBy('date', 'desc')->limit(10) - ->get(['type', DB::raw('\'wallet\' as source'), 'montant', 'numCarte AS destinataire', 'date', 'id']); + $transactions = DB::select('SELECT tit.nom as operation , tit.type ,tit.acteur as source , wit.montant , + CASE + WHEN u.lastname IS NOT NULL THEN u.lastname + ELSE + CASE + WHEN wit.id_destinataire IS NULL THEN wit.nom_destinataire + ELSE wit.id_destinataire + END + END AS destinataire , wit.date , wit.id FROM wallet_ilink_transaction wit + INNER JOIN type_ilink_transaction tit ON wit.type = tit.id LEFT JOIN users u ON u.user_code = wit.id_destinataire WHERE wit.id_wallet_user = :id_wallet + ORDER BY wit.date DESC LIMIT 10;',['id_wallet', $id_wallet_user]); + return $this->successResponse($transactions); + } + + public function lastAgentTransactions($id_wallet_agent) + { + $transactions = DB::select('SELECT tit.nom as operation , tit.type ,tit.acteur as source , wit.montant , + CASE + WHEN u.lastname IS NOT NULL THEN u.lastname + ELSE + CASE + WHEN wit.id_destinataire IS NULL THEN wit.nom_destinataire + ELSE wit.id_destinataire + END + END AS destinataire , wit.date , wit.id FROM wallet_ilink_transaction wit + INNER JOIN type_ilink_transaction tit ON wit.type = tit.id LEFT JOIN users u ON u.user_code = wit.id_destinataire WHERE wit.id_wallet_ag = :id_wallet + ORDER BY wit.date DESC LIMIT 10;',['id_wallet', $id_wallet_agent]); return $this->successResponse($transactions); } public function calculateCommission(Request $request) { $rules = [ - 'id_wallet' => 'required|integer|min:1', + 'type' => 'required|integer|min:0|not_in:0', + 'id_wallet_agent' => 'required_without:id_wallet_user|integer|min:0|not_in:0', + 'id_wallet_user' => 'required_without:id_wallet_agent|integer|min:0|not_in:0', 'montant' => 'required|numeric|min:0|not_in:0', - 'type' => 'required|in:credit,debit', ]; - $this->validate($request, $rules); + if (isset($request->id_wallet_agent)) { + $walletAgent = Wallet::findOrFail($request->get('id_wallet_agent')); + $network_agent = NetworksAgent::findOrFail($walletAgent->id_networkAgent); + // Configuratrion du wallet + $config = ConfigWallet::where('id_network', $network_agent->network_id)->firstOrFail(); - $walletAgent = Wallet::findOrFail($request->get('id_wallet')); - $network_agent = NetworksAgent::findOrFail($walletAgent->id_networkAgent); - // Configuratrion du wallet - $config = ConfigWallet::where('id_network', $network_agent->network_id)->firstOrFail(); - $commission = null; - if ($request->type == 'credit') { - //Depot - $commission = ($request->montant * $config->taux_com_client_depot / 100) + $config->frais_min_banque_depot; - $data['montant_calcule'] = $request->montant - $commission; - } elseif ($request->type == 'debit') { - // Retrait - $commission = $request->montant * $config->taux_com_client_retrait / 100; - $data['montant_calcule'] = $request->montant + $commission; + } else { + $walletUser = WalletsUser::findOrFail($request->id_wallet_user); + $init_country = $walletUser->user->network->country->id; + $result = ConfigWallet::join('networks', 'networks.id', '=', 'configWallet.id_network') + ->where('networks.country_id', $init_country)->where('configWallet.type', 'ilink') + ->select('configWallet.id')->first(); + if ($result) { + $config = ConfigWallet::findOrFail($result->id); + } else { + return $this->errorResponse(trans('errors.no_ilink_network')); + } + } + + $taxesNationales = array_values(array_filter($config->taxes->all(), function ($tax) { + return $tax->destination == 'national'; + })); + + $taxesInternationales = array_values(array_filter($config->taxes->all(), function ($tax) { + return $tax->destination == 'international'; + })); + + + $plr_user_wallet_wallet = $this->getPaliers($config->paliers_config_wallets->all(), "user_wallet_wallet_international"); + $plr_user_wallet_cash = $this->getPaliers($config->paliers_config_wallets->all(), "user_wallet_cash_international"); + $plr_agent_depot_wallet_ilink = $this->getPaliers($config->paliers_config_wallets->all(), "agent_depot_wallet_ilink_international"); + $plr_agent_depot_autre_wallet = $this->getPaliers($config->paliers_config_wallets->all(), "agent_depot_autre_wallet_international"); + $plr_agent_cash_cash = $this->getPaliers($config->paliers_config_wallets->all(), "agent_cash_cash_international"); + + $plr_user_wallet_wallet_national = $this->getPaliers($config->paliers_config_wallets->all(), "user_wallet_wallet_national"); + $plr_user_wallet_cash_national = $this->getPaliers($config->paliers_config_wallets->all(), "user_wallet_cash_national"); + $plr_agent_depot_wallet_ilink_national = $this->getPaliers($config->paliers_config_wallets->all(), "agent_depot_wallet_ilink_national"); + $plr_agent_depot_autre_wallet_national = $this->getPaliers($config->paliers_config_wallets->all(), "agent_depot_autre_wallet_national"); + $plr_agent_cash_cash_national = $this->getPaliers($config->paliers_config_wallets->all(), "agent_cash_cash_national"); + switch ($request->type) { + case 1: //User - Envoi wallet à wallet + $this->validate($request, [ + 'final_country' => 'required|integer|min:0|not_in:0', + 'id_destinataire' => 'required_without:phone_destinataire' + ]); + $frais = ($init_country != $request->final_country) ? $this->calculateFees($plr_user_wallet_wallet, $request->montant) : $this->calculateFees($plr_user_wallet_wallet_national, $request->montant); + $taxe = ($init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais); + $destinataire = User::where('user_code', $request->id_destinataire)->first(); + $data['destinataire'] = $destinataire ? $destinataire->lastname . ' ' . $destinataire->firstname : 'Inconnu'; + $data['frais'] = $frais + $taxe; + $data['montant_net'] = $request->montant - $frais - $taxe; + return $this->successResponse($data); + break; + case 2: //User - Envoi de wallet à carte + $frais = $request->montant * $config->taux_com_user_wallet_carte / 100; + $data['frais'] = $frais; + $data['montant_net'] = $request->montant - $frais; + return $this->successResponse($data); + break; } - $data['commission'] = $commission; - return $this->successResponse($data); } @@ -583,25 +665,27 @@ class iLinkTransactionController extends Controller private function calculateFees(array $paliers, $montant) { $size = sizeof($paliers); + if ($size > 0) { + $min = $paliers[0]->min; + $max = $paliers[$size - 1]->max; + $palier = null; + foreach ($paliers as $p) { + if ($montant >= $p->min && $montant <= $p->max) { + $palier = $p; + break; + } + } - $min = $paliers[0]->min; - $max = $size > 0 ? $paliers[$size - 1]->max : 0; - $palier = null; - foreach ($paliers as $p) { - if ($montant >= $p->min && $montant <= $p->max) { - $palier = $p; - break; + if ($palier) { + return (($palier->min + $palier->max) / 2 * $palier->taux / 100); + } else { + if ($montant < $min) + return $min * $paliers[0]->taux / 100; + else if ($montant > $max) + return $max * $paliers[$size - 1]->taux / 100; } } - if ($palier) { - return (($palier->min + $palier->max) / 2 * $palier->taux / 100); - } else { - if ($montant < $min) - return $min * $paliers[0]->taux / 100; - else if ($montant > $max) - return $max * $paliers[$size - 1]->taux / 100; - } } diff --git a/app/Models/Network.php b/app/Models/Network.php index 548acb3..2a4798c 100755 --- a/app/Models/Network.php +++ b/app/Models/Network.php @@ -11,13 +11,13 @@ use Illuminate\Database\Eloquent\Model; /** * Class Network - * + * * @property int $id * @property int $country_id * @property string $name * @property int $id_networkAgent * @property int $status - * + * * @property Collection|ConfigWallet[] $config_wallets * @property Collection|Identification[] $identifications * @property WalletsPassword $wallets_password @@ -56,4 +56,9 @@ class Network extends Model { return $this->hasOne(WalletsPassword::class); } + + public function country() + { + return $this->belongsTo(Country::class, 'country_id'); + } } diff --git a/app/Models/User.php b/app/Models/User.php index 41919db..eb42f95 100755 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -81,4 +81,9 @@ class User extends Model { return $this->hasMany(WalletsUser::class, 'idUser'); } + + public function network() + { + return $this->belongsTo(Network::class, 'network_id'); + } } diff --git a/app/Models/WalletIlinkTransaction.php b/app/Models/WalletIlinkTransaction.php index d5046b1..6205361 100644 --- a/app/Models/WalletIlinkTransaction.php +++ b/app/Models/WalletIlinkTransaction.php @@ -210,7 +210,6 @@ class WalletIlinkTransaction extends Model public function send_wallet_wallet_rules(){ return [ - 'init_country' =>'required|integer|min:0|not_in:0', 'final_country' =>'required|integer|min:0|not_in:0', 'type_document_destinataire'=>'required', 'id_document_destinataire'=>'required', diff --git a/app/Traits/Helper.php b/app/Traits/Helper.php index e2473f4..90b7fa0 100644 --- a/app/Traits/Helper.php +++ b/app/Traits/Helper.php @@ -92,4 +92,8 @@ trait Helper return $final_money->formatTo('fr_FR'); } + public function getNetworkEmetteur($id_wallet){ + + } + } diff --git a/resources/lang/en/errors.php b/resources/lang/en/errors.php index 106a0c2..7b862b2 100755 --- a/resources/lang/en/errors.php +++ b/resources/lang/en/errors.php @@ -9,6 +9,8 @@ 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 recipient wallet code does not exist', 'insufficient_balance'=> 'The balance is insufficient to complete this transaction', + 'no_ilink_network' => 'Sorry, there is no iLink World network in your country', + 'wallet_country_not_match' => 'This recipient wallet code is not registered in the country :country' ]; diff --git a/resources/lang/fr/errors.php b/resources/lang/fr/errors.php index 64f96f4..d738fd3 100755 --- a/resources/lang/fr/errors.php +++ b/resources/lang/fr/errors.php @@ -9,6 +9,8 @@ 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 wallet destinataire n\'existe pas', 'insufficient_balance'=> 'Le solde est insuffisant pour effectuer cette transaction', + 'no_ilink_network' => 'Désolé , il n\'existe pas de reseau iLink World dans votre pays', + 'wallet_country_not_match' => 'Ce code wallet destinataire n\'est pas enregistré dans le pays :country' ]; diff --git a/routes/web.php b/routes/web.php index 892ce0c..7ce35c2 100755 --- a/routes/web.php +++ b/routes/web.php @@ -29,6 +29,9 @@ $router->group(['prefix' => '/transactions'] , function () use ($router){ // Transactions wallet ilink $router->group(['prefix' => '/ilink'] , function () use ($router){ $router->post('','iLinkTransactionController@add'); + $router->post('commission','iLinkTransactionController@calculateCommission'); + $router->get('user/{id_wallet_user}','iLinkTransactionController@lastUserTransactions'); + $router->get('agent/{id_wallet_agent}','iLinkTransactionController@lastAgentTransactions'); }); });