+ Adding User - Envoi wallet à wallet

This commit is contained in:
Djery-Tom 2020-06-21 22:49:24 +01:00
parent 7e3ce25b86
commit ffd6d77a1e
6 changed files with 321 additions and 140 deletions

View File

@ -2,6 +2,7 @@
namespace App\Http\Controllers;
use App\Models\Country;
use App\Traits\ApiResponser;
use Illuminate\Support\Facades\DB;
@ -20,9 +21,20 @@ class HelperController extends Controller
public function countries()
{
$countries = DB::select('SELECT id , name , currency_code FROM countries_currencies WHERE id IN (
SELECT distinct c.id FROM networks n INNER JOIN countries_currencies c ON n.country_id=c.id INNER JOIN configWallet cw ON cw.id_network = n.id WHERE status = 1
$countries = DB::select('SELECT id , name , code_dial FROM countries WHERE id IN (
SELECT distinct n.country_id FROM networks n WHERE n.status = 1
)');
return $this->successResponse($countries);
}
public function paying_networks($id_country)
{
$networks = DB::select('SELECT id , name FROM networks WHERE id IN ( SELECT distinct id_network FROM paying_networks )
AND status = 1 AND country_id = :id;',['id'=>$id_country]);
return $this->successResponse($networks);
}
public function country($code_dial){
return $this->successResponse(Country::where('code_dial',$code_dial)->firstOrFail());
}
}

View File

@ -59,15 +59,11 @@ class UserController extends Controller
}
// dd($request->all());
$this->validate($request, [
'id_network' => 'required|integer|min:0|not_in:0',
'id_country' => 'required|integer|min:0|not_in:0',
'document_image_front' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:6048',
'document_image_back' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:6048',
'user_image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:6048',
]);
$identification->idNetwork = $request->id_network;
$identification->country_id = $request->id_country;
$identification->document_image_front = $this->uploadImage($request,'document_image_front','D-F',"documents");
$identification->document_image_back = $this->uploadImage($request,'document_image_back','D-B',"documents");
$identification->user_image = $this->uploadImage($request,'user_image','U',"photos");

View File

@ -6,6 +6,7 @@ use App\Models\AgentPlus;
use App\Models\CodeGenerer;
use App\Models\ConfigWallet;
use App\Models\NetworksAgent;
use App\Models\PayingNetwork;
use App\Models\TypeIlinkTransaction;
use App\Models\PaliersConfigWallet;
use App\Models\User;
@ -41,12 +42,15 @@ class iLinkTransactionController extends Controller
$transaction = new WalletIlinkTransaction();
$this->validate($request, [
'type' => 'required|integer|min:0|not_in:0',
'id_wallet_agent' => 'integer|min:0|not_in:0',
'id_wallet_user' => 'integer|min:0|not_in:0',
'password' => 'required'
'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',
]);
$type = TypeIlinkTransaction::findOrFail($request->type);
if (isset($request->id_wallet_agent)) {
$walletAgent = Wallet::findOrFail($request->get('id_wallet_agent'));
$network_agent = NetworksAgent::findOrFail($walletAgent->id_networkAgent);
// Configuratrion du wallet
@ -61,6 +65,14 @@ class iLinkTransactionController extends Controller
$wallet_agent_hyp = WalletAgent::where('agent_id', $hyperviseur->id)->firstOrFail();
$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();
$hyperviseur = AgentPlus::where('category', 'hyper')->where('network_id', $request->id_network)->firstOrFail();
$wallet_agent_hyp = WalletAgent::where('agent_id', $hyperviseur->id)->firstOrFail();
$walletHyperviseur = Wallet::findOrFail($wallet_agent_hyp->wallet_id);
}
$taxesNationales = array_values(array_filter($config->taxes->all(), function ($tax) {
return $tax->destination == 'national';
@ -97,7 +109,39 @@ 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);
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;
$reseauPayeur = PayingNetwork::where('id_network',$request->network_destinataire)->where('id_configWallet',$config->id)->first();
if($reseauPayeur){ //Si le reseau existe chez iLink
$transaction->part_reseau_payeur = $frais* $reseauPayeur->taux_partage / 100;
$transaction->part_reseau_emetteur = $frais - $transaction->part_reseau_payeur;
$walletHyperviseur->balance_com += $transaction->part_reseau_emetteur;
$reseauPayeur->balance_com += $transaction->part_reseau_payeur;
$reseauPayeur->save();
}else{
// Emettre requete SSL vers le reseau correspondant
}
$destinatire = User::where('user_code', $request->id_destinataire)->first();
if($destinatire){ // Si c'est un wallet ilink
$walletDestinataire = WalletsUser::where('idUser',$destinatire->id)->firstOrFail();
$walletDestinataire->balance += $montantDepot;
$walletDestinataire->save();
}else{
//Emettre requete SSL vers wallet correspondant
}
$walletUser->balance -= $transaction->montant;
$walletHyperviseur->save();
$walletUser->save();
$transaction->save();
return $this->successResponse(trans('messages.successful_transaction'));
} else {
return $this->errorResponse(trans('messages.incorrect_user_password'));
}
break;
case 2: //User - Envoi de wallet à carte
@ -131,14 +175,15 @@ class iLinkTransactionController extends Controller
$agent = AgentPlus::findOrFail($network_agent->agent_id);
if ($this->checkPassword($request->password, $agent->encrypted_password, $agent->salt)) {
$transaction = WalletIlinkTransaction::find($request->id_transaction);
if($transaction){
if($transaction->status_retrait == 0){
if($this->checkPassword($request->code_retrait, $transaction->encrypted_code_retrait, $transaction->code_retrait_salt)){
$part_ag = floatval($transaction->frais * $config->taux_com_ag_retrait_cash/ 100) ;
$part_sup = floatval($transaction->frais * $config->taux_com_sup_retrait_cash/ 100);
$walletAgent->balance_princ -= $transaction->montant_retrait;
if ($transaction) {
if ($transaction->status_retrait == 0) {
if ($this->checkPassword($request->code_retrait, $transaction->encrypted_code_retrait, $transaction->code_retrait_salt)) {
if ($transaction->montant_retrait == $request->montant) {
$part_ag = floatval($transaction->frais * $config->taux_com_ag_retrait_cash / 100);
$part_sup = floatval($transaction->frais * $config->taux_com_sup_retrait_cash / 100);
$walletAgent->balance_princ += $transaction->montant_retrait;
$walletAgent->balance_com += $part_ag;
$walletSuperviseur->balance_com += $part_sup ;
$walletSuperviseur->balance_com += $part_sup;
$walletHyperviseur->balance_com -= ($part_ag + $part_sup);
$transaction->status_retrait = 1;
$transaction->date_retrait = new \DateTime();
@ -147,21 +192,80 @@ class iLinkTransactionController extends Controller
$walletHyperviseur->save();
$transaction->save();
return $this->successResponse(trans('messages.successful_transaction'));
}else{
} else {
return $this->errorResponse('Montant de retrait incorrect');
}
} else {
return $this->errorResponse('Code de retrait invalide');
}
}else{
} else {
return $this->errorResponse('Retrait déjà éffectuée');
}
}else{
return $this->errorResponse('Cette transaction n\'existe pas',Response::HTTP_NOT_FOUND);
} else {
return $this->errorResponse('Cette transaction n\'existe pas', Response::HTTP_NOT_FOUND);
}
}else{
} else {
return $this->errorResponse(trans('messages.incorrect_user_password'));
}
break;
case 13: // Agent - Retrait de la carte vers cash
$this->validate($request, $transaction->card_rules());
$agent = AgentPlus::findOrFail($network_agent->agent_id);
if ($this->checkPassword($request->password, $agent->encrypted_password, $agent->salt)) {
$expiration_date = \DateTime::createFromFormat('m/y', $request->expiration_date);
if (!$expiration_date)
$expiration_date = new \DateTime();
$transaction->expiration_date = $expiration_date;
$frais = floatval($request->montant * $config->taux_com_wallet_ag_carte_cash / 100);
$montantRetrait = $transaction->montant + $frais;
$transaction->montant_retrait = $montantRetrait;
$body['amount'] = $montantRetrait;
$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/pull', ['json' => $body]);
$code = 200; // $response->getStatusCode();
if ($code == 200) {
$banqueCommission = floatval($frais * $config->taux_com_banque_retrait_carte_cash / 100);
$transaction->commission_banque = $banqueCommission;
// 2---> Emmètre via API sécurisé SSL une requête de débit de notre
//compte marchand du (Part de la banque partenaire en %
//pour le dépôtqui sapplique sur les frais minimum) et créditer
//le compte des opérations défini avec notre banque
//partenaire
$walletAgent->balance_princ += $transaction->montant;
$agentCommission = floatval($frais * $config->taux_com_ag_retrait_carte_cash / 100);
$superviseurCommission = floatval($frais * $config->taux_com_sup_retrait_carte_cash / 100);
$hyperviseurCommission = floatval($frais * $$config->taux_com_hyp_retrait_carte_cash / 100);
$walletAgent->balance_com += $agentCommission;
$transaction->commission_ag = $agentCommission;
$walletSuperviseur->balance_com += $superviseurCommission;
$transaction->commission_sup = $superviseurCommission;
$walletHyperviseur->balance_com += $hyperviseurCommission;
$transaction->commission_hyp = $hyperviseurCommission;
$transaction->id_wallet_ag = $walletAgent->id;
$transaction->id_wallet_sup = $walletSuperviseur->id;
$transaction->id_wallet_hyp = $walletHyperviseur->id;
$transaction->frais = $frais;
$transaction->date = new \DateTime();
$walletAgent->save();
$walletSuperviseur->save();
$walletHyperviseur->save();
$transaction->save();
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 14: // Agent - Envoi de cash vers wallet iLink
$this->validate($request, $transaction->cash_wallet_rules());
@ -198,8 +302,8 @@ class iLinkTransactionController extends Controller
$transaction->id_wallet_hyp = $walletHyperviseur->id;
$transaction->save();
$this->sendMail($user->email, trans('messages.successful_transaction'), trans('messages.successful_deposit_ilink',
['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,$request->init_country) ,'tax' => $this->toMoney($taxe,$request->init_country),
['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, $request->init_country), 'tax' => $this->toMoney($taxe, $request->init_country),
'user_code' => $request->user_code]));
return $this->successResponse(trans('messages.successful_transaction'));
} else {
@ -243,7 +347,7 @@ class iLinkTransactionController extends Controller
}
break;
case 16: // Agent - Envoi de cash vers une carte visa
$this->validate($request, $transaction->cash_cash_rules());
$this->validate($request, $transaction->card_rules());
$agent = AgentPlus::findOrFail($network_agent->agent_id);
if ($this->checkPassword($request->password, $agent->encrypted_password, $agent->salt)) {
$expiration_date = \DateTime::createFromFormat('m/y', $request->expiration_date);
@ -341,9 +445,9 @@ class iLinkTransactionController extends Controller
$transaction->save();
$this->sendMail($request->email_emetteur, trans('messages.successful_transaction'), trans('messages.successful_send_cash',
['sender_name' => $request->prenom_emetteur . ' ' . $request->nom_emetteur, 'receiver_name' => $request->prenom_destinataire . ' ' . $request->prenom_destinataire,
'id_transaction' => $transaction->id, 'amount' => $this->toMoney($transaction->montant,$request->init_country), 'net_init' =>$this->toMoney($montantRetrait,$request->init_country) ,
'net_final' =>$this->convertMoney($montantRetrait,$request->init_country,$request->final_country) ,'fees' => $this->toMoney($frais,$request->init_country) ,'tax' => $this->toMoney($taxe,$request->init_country),
'code' => wordwrap($code_retrait , 4 , ' ' , true )]));
'id_transaction' => $transaction->id, 'amount' => $this->toMoney($transaction->montant, $request->init_country), 'net_init' => $this->toMoney($montantRetrait, $request->init_country),
'net_final' => $this->convertMoney($montantRetrait, $request->init_country, $request->final_country), 'fees' => $this->toMoney($frais, $request->init_country), 'tax' => $this->toMoney($taxe, $request->init_country),
'code' => wordwrap($code_retrait, 4, ' ', true)]));
return $this->successResponse(trans('messages.successful_transaction'));
} else {
return $this->errorResponse(trans('messages.incorrect_user_password'));

View File

@ -0,0 +1,53 @@
<?php
/**
* Created by Reliese Model.
*/
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
/**
* Class PayingNetwork
*
* @property int $id
* @property int $id_network
* @property float $taux_partage
* @property float $balance_com
* @property int $id_configWallet
*
* @property Network $network
* @property ConfigWallet $config_wallet
*
* @package App\Models
*/
class PayingNetwork extends Model
{
protected $table = 'paying_networks';
public $timestamps = false;
protected $casts = [
'id_network' => 'int',
'taux_partage' => 'float',
'balance_com' => 'float',
'id_configWallet' => 'int'
];
protected $fillable = [
'id_network',
'taux_partage',
'balance_com',
'id_configWallet'
];
public function network()
{
return $this->belongsTo(Network::class, 'id_network');
}
public function config_wallet()
{
return $this->belongsTo(ConfigWallet::class, 'id_configWallet');
}
}

View File

@ -30,10 +30,13 @@ use Illuminate\Database\Eloquent\Model;
* @property string $nom_emetteur
* @property string $prenom_emetteur
* @property string $email_emetteur
* @property int $network_emetteur
* @property string $type_document_emetteur
* @property string $id_document_emetteur
* @property float $frais
* @property float $taxe
* @property float $part_reseau_emetteur
* @property float $part_reseau_payeur
* @property string $numero_carte
* @property Carbon $expiration_date
* @property int $init_country
@ -69,8 +72,11 @@ class WalletIlinkTransaction extends Model
'montant_retrait' => 'float',
'status_retrait' => 'int',
'network_destinataire' => 'int',
'network_emetteur' => 'int',
'frais' => 'float',
'taxe' => 'float',
'part_reseau_emetteur' => 'float',
'part_reseau_payeur' => 'float',
'init_country' => 'int',
'final_country' => 'int',
'commission_banque' => 'float',
@ -109,10 +115,13 @@ class WalletIlinkTransaction extends Model
'nom_emetteur',
'prenom_emetteur',
'email_emetteur',
'network_emetteur',
'type_document_emetteur',
'id_document_emetteur',
'frais',
'taxe',
'part_reseau_emetteur',
'part_reseau_payeur',
'numero_carte',
'expiration_date',
'init_country',
@ -152,7 +161,7 @@ class WalletIlinkTransaction extends Model
public function network()
{
return $this->belongsTo(Network::class, 'network_destinataire');
return $this->belongsTo(Network::class, 'network_emetteur');
}
// Regles de validation
@ -163,14 +172,12 @@ class WalletIlinkTransaction extends Model
'user_code'=>'required',
'init_country' =>'required|integer|min:0|not_in:0',
'final_country' =>'required|integer|min:0|not_in:0',
'montant'=> 'required|numeric|min:0|not_in:0',
];
}
public function card_rules()
{
return [
'montant'=> 'required|numeric|min:0|not_in:0',
'numero_carte'=>'required',
'cvv'=>'required_if:facade,front|size:3',
'expiration_date'=>'required_if:facade,front|date_format:m/y|after_or_equal:today',
@ -191,7 +198,6 @@ class WalletIlinkTransaction extends Model
'type_document_destinataire'=>'required',
'id_document_destinataire'=>'required',
'id_destinataire' => 'required',
'montant'=> 'required|numeric|min:0|not_in:0'
];
}
@ -199,7 +205,15 @@ class WalletIlinkTransaction extends Model
return [
'id_transaction' =>'required|integer|min:0|not_in:0',
'code_retrait' =>'required|size:16',
'montant'=> 'required|numeric|min:0|not_in:0'
];
}
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',
'id_destinataire' =>'required|integer|min:0|not_in:0',
'network_destinataire'=>'required|integer|min:0|not_in:0',
];
}
}

View File

@ -16,6 +16,8 @@
//});
// Helper routes
$router->get('countries','HelperController@countries');
$router->get('countries/{dial_code}','HelperController@country');
$router->get('paying_networks/{id_country}','HelperController@paying_networks');
// Transactions routes
$router->group(['prefix' => '/transactions'] , function () use ($router){