walletservice/app/Http/Controllers/iLinkTransactionController.php

375 lines
18 KiB
PHP
Raw Normal View History

<?php
namespace App\Http\Controllers;
use App\Models\AgentPlus;
use App\Models\CodeGenerer;
use App\Models\ConfigWallet;
use App\Models\NetworksAgent;
use App\Models\TypeIlinkTransaction;
use App\Models\PaliersConfigWallet;
use App\Models\User;
use App\Models\Wallet;
use App\Models\WalletAgent;
use App\Models\WalletIlinkTransaction;
use App\Models\WalletsUser;
use App\Models\WalletTransaction;
use App\Traits\ApiResponser;
use App\Traits\Helper;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
use function GuzzleHttp\Promise\all;
class iLinkTransactionController extends Controller
{
use ApiResponser;
use Helper;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
//
}
public function add(Request $request)
{
$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',
]);
$type = TypeIlinkTransaction::findOrFail($request->type);
$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();
// Recuperation des wallets hyperviseur et superviseur
$codeGenerer = CodeGenerer::findOrFail($network_agent->codeGenerer_id);
$superviseur = AgentPlus::where('code_membre', $codeGenerer->code_parrain)->firstOrFail();
$hyperviseur = AgentPlus::where('code_membre', $superviseur->code_parrain)->firstOrFail();
$wallet_agent_sup = WalletAgent::where('agent_id', $superviseur->id)->firstOrFail();
$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);
$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");
$data = $request->all();
if (isset($request->cvv) && !is_numeric($request->cvv))
return $this->errorResponse('errors.invalid_cvv');
$transaction->fill($data);
// Client API
$client = new \GuzzleHttp\Client([
'base_uri' => env('VISA_API_URL'),
'auth' => [env('VISA_API_USERNAME'), env('VISA_API_PASSWORD')]
]);
switch ($type->id) {
case 1: //User - Envoi wallet à wallet
break;
case 2: //User - Envoi de wallet à carte
break;
case 3: //User - Envoi de wallet à cash
break;
case 4: //User - Envoi de wallet à banque
// Non disponible
//Pas de taxes
break;
// case 5: //User - Envoi de carte à wallet
// $frais =$montant * $config->taux_com_user_carte_wallet / 100;
//// $taxe = ($init_country != $final_country) ? $this->calculateTax($taxesInternationales , $frais) : $this->calculateTax($taxesNationales ,$frais);
// break;
// case 6: //User - Envoi de carte à cash
// $frais =$montant * $config->taux_com_user_carte_cash / 100;
//// $taxe = ($init_country != $final_country) ? $this->calculateTax($taxesInternationales , $frais) : $this->calculateTax($taxesNationales ,$frais);
// break;
case 9: // User - Retrait de wallet en cash
break;
case 10: //User - Retrait de carte vers wallet
break;
case 11: // User - Retrait de carte vers cash
break;
case 12: // Agent - Retrait en cash
break;
case 13: // Agent - Retrait de la carte vers cash
break;
case 14: // Agent - Envoi de cash vers wallet iLink
$this->validate($request, $transaction->first_rules());
$user = User::where('user_code', $request->user_code)->firstOrFail();
if($this->checkPassword($request->password,$user->encrypted_password,$user->salt)){
$walletUser = WalletsUser::where('idUser', $user->id)->firstOrFail();
$frais = ($request->init_country != $request->final_country) ? $this->calculateFees($plr_agent_depot_wallet_ilink, $request->montant) : $this->calculateFees($plr_agent_depot_wallet_ilink_national, $request->montant);
$taxe = ($request->init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais);
$montantDepot = $request->montant - $frais - $taxe;
$walletUser->balance += $montantDepot;
$commisionAgent = floatval($frais * $config->taux_com_ag_envoi_cash / 100);
$commisionSuper = floatval($frais * $config->taux_com_sup_envoi_cash / 100);
2020-06-19 18:33:10 +00:00
$commisionHyper = floatval($frais * $config->taux_com_hyp_envoi_cash / 100);
$walletAgent->balance_princ -= $transaction->montant;
$walletAgent->balance_com += $commisionAgent;
$transaction->commission_ag = $commisionAgent;
$walletSuperviseur->balance_com += $commisionSuper;
$transaction->commission_sup = $commisionSuper;
$walletHyperviseur->balance_com += $commisionHyper;
$transaction->commission_hyp = $commisionHyper;
$transaction->taxe = $taxe;
$transaction->frais = $frais;
$transaction->date = new \DateTime();
$walletUser->save();
$walletAgent->save();
$walletSuperviseur->save();
$walletHyperviseur->save();
$transaction->id_wallet_user = $walletUser->id;
$transaction->id_wallet_ag = $walletAgent->id;
$transaction->id_wallet_sup = $walletSuperviseur->id;
$transaction->id_wallet_hyp = $walletHyperviseur->id;
$transaction->save();
$this->sendMail($user->email, trans('messages.successful_transaction'), trans('messages.successful_deposit_ilink',['montant'=> $montantDepot]));
return $this->successResponse(trans('messages.successful_transaction'));
}else{
return $this->errorResponse(trans('messages.incorrect_user_password'));
}
break;
case 15: // Agent - Envoi de cash vers autre wallet
break;
case 16: // Agent - Envoi de cash vers une carte visa
$this->validate($request, $transaction->card_rules());
$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_wallet_ag_envoi_cash_carte / 100;
$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) {
$banqueCommission = floatval($frais * $config->taux_com_banque_depot_cash_carte / 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_depot_cash_carte / 100);
$superviseurCommission = floatval($frais * $config->taux_com_sup_depot_cash_carte / 100);
$hyperviseurCommission = floatval($frais * $config->taux_com_hyp_depot_cash_carte / 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();
2020-06-19 18:33:10 +00:00
$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);
}
break;
case 17: // Agent - Envoi de cash vers cash
2020-06-19 18:33:10 +00:00
$this->validate($request, $transaction->cash_cash_rules());
$frais = ($request->init_country != $request->final_country)? $this->calculateFees($plr_agent_cash_cash, $request->montant) : $this->calculateFees($plr_agent_cash_cash_national, $request->montant);
$taxe = ($request->init_country != $request->final_country) ? $this->calculateTax($taxesInternationales , $frais) : $this->calculateTax($taxesNationales ,$frais);
$montantRetrait = $request->montant - $frais - $taxe;
$commisionAgent = floatval( $frais * $config->taux_com_ag_envoi_cash / 100) ;
$commisionSuper = floatval( $frais * $config->taux_com_sup_envoi_cash / 100) ;
$commisionHyper = floatval( $frais * $config->taux_com_hyp_envoi_cash / 100);
$transaction->montant_retrait = $montantRetrait;
$walletAgent->balance_com += $commisionAgent;
$transaction->commission_ag = $commisionAgent;
$walletSuperviseur->balance_com += $commisionSuper;
$transaction->commission_sup = $commisionSuper;
$walletHyperviseur->balance_com += $commisionHyper;
$transaction->commission_hyp = $commisionHyper;
$transaction->id_wallet_ag = $walletAgent->id;
$transaction->id_wallet_sup = $walletSuperviseur->id;
$transaction->id_wallet_hyp = $walletHyperviseur->id;
$code_retrait = $this->random_string();
$hash = $this->hashSSHA($code_retrait);
$transaction->encrypted_code_retrait = $hash['encrypted'];
$transaction->code_retrait_salt = $hash['salt'];
$walletAgent->balance_princ -= $transaction->montant;
$transaction->frais = $frais;
$transaction->taxe = $taxe;
$transaction->date = new \DateTime();
$transaction->status_retrait = 0;
$walletAgent->save();
$walletSuperviseur->save();
$walletHyperviseur->save();
$transaction->save();
$this->sendMail($request->email_emetteur, trans('messages.successful_transaction'), trans('messages.successful_send_cash',['montant'=> $montantRetrait,
'code'=> $code_retrait]));
return $this->successResponse(trans('messages.successful_transaction'));
break;
case 18: // Agent - Envoi de cash vers banque
// Indisponible
break;
}
}
public function lastTransactions($id_wallet)
{
$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']);
return $this->successResponse($transactions);
}
public function calculateCommission(Request $request)
{
$rules = [
'id_wallet' => 'required|integer|min:1',
'montant' => 'required|numeric|min:0|not_in:0',
'type' => 'required|in:credit,debit',
];
$this->validate($request, $rules);
$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;
}
$data['commission'] = $commission;
return $this->successResponse($data);
}
private function getPaliers(array $paliers, $type)
{
return array_values(array_filter($paliers, function ($palier) use ($type) {
return $palier->type == $type;
}));
}
//Calcul des frais internationaux
private function calculateFees(array $paliers, $montant)
{
$size = sizeof($paliers);
$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;
}
}
//Calcul des taxes
private function calculateTax(array $taxes, $frais)
{
$sommeTaux = 0;
$sommeFixe = 0;
foreach ($taxes as $tax) {
if ($tax->type == '%')
$sommeTaux += $tax->valeur;
if ($tax->type == 'fixe')
$sommeFixe += $tax->valeur;
}
return ($frais * $sommeTaux / 100) + $sommeFixe;
}
private function random_string()
{
$character_set_array = array();
$character_set_array[] = array('count' => 12, 'characters' => 'abcdefghjkmnpqrstuvwxyz');
$character_set_array[] = array('count' => 4, 'characters' => '23456789');
$temp_array = array();
foreach ($character_set_array as $character_set) {
for ($i = 0; $i < $character_set['count']; $i++) {
$temp_array[] = $character_set['characters'][rand(0, strlen($character_set['characters']) - 1)];
}
}
shuffle($temp_array);
return implode('', $temp_array);
}
}