walletservice/app/Http/Controllers/iLinkTransactionController.php

335 lines
15 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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);
$commisionHyper = floatval($frais * $config->taux_com_ag_envoi_cash / 100);
$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();
$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
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);
}
}