walletservice/app/Http/Controllers/iLinkTransactionController.php

2360 lines
151 KiB
PHP
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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\Country;
use App\Models\Identification;
use App\Models\NetworksAgent;
use App\Models\NetworksOperator;
use App\Models\PayingNetwork;
use App\Models\Regulation;
use App\Models\TypeIlinkTransaction;
use App\Models\TypeOperator;
use App\Models\User;
use App\Models\Wallet;
use App\Models\WalletAgent;
use App\Models\WalletIlinkTransaction;
use App\Models\WalletsUser;
use App\Traits\ApiResponser;
use App\Traits\Helper;
use Carbon\Carbon;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class iLinkTransactionController extends Controller
{
use ApiResponser;
use Helper;
private $PAYMENT_URL = "/adyen-api/v1/transaction/payement";
private $PAYOUT_URL = "/adyen-api/v1/transaction/payout";
private $REFUND_URL = "/adyen-api/v1/transaction/refund";
private $PAYING_NETWORK_SIMULATOR_SEND_FRAME_URL = 'http://localhost:8084/receive_payment';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* @OA\Post(
* path="/transactions/ilink",
* summary="Effectuer une transaction dans le wallet iLink",
* tags={"Transaction iLink"},
* security={{"api_key":{}}},
* @OA\RequestBody(
* description="Corps de la requete",
* required=true,
* @OA\MediaType(
* mediaType="application/json",
* @OA\Schema(
* oneOf={
* @OA\Schema(ref="#/components/schemas/user_payement_of_operator"),
* @OA\Schema(ref="#/components/schemas/user_remove_from_bank_to_wallet"),
* @OA\Schema(ref="#/components/schemas/user_send_from_wallet_to_bank"),
* @OA\Schema(ref="#/components/schemas/agent_send_from_cash_to_bank"),
* }
* ),
* examples = {
* "user_payement_of_operator" : {
* "summary" : "User - Payer une facture chez un opérateur donné",
* "value" : {"type":19,"id_wallet_user":9,"id_wallet_network":101,"no_facture":"CDE1425533","type_operator":"water","id_operator":6,"montant":100000,"password":"1234"}
* },
* "user_remove_from_bank_to_wallet" : {
* "summary" : "User - Retrait du compte bancaire rattaché vers le wallet de l'utilisateur",
* "value": {"type":20,"id_wallet_user":1,"montant":100000,"password":"1234"}
* },
* "user_send_from_wallet_to_bank" : {
* "summary" : "User - Envoi de wallet à banque",
* "value": {"type":4,"id_wallet_user":9,"id_wallet_network":101,"montant":100000,"password":"1234"}
* },
* "agent_send_from_cash_to_bank" : {
* "summary" : "Agent - Envoi de cash vers banque",
* "value" : {"type":18,"id_wallet_agent":9716,"id_wallet_network":101,"iban":"CM15UBAA412341234123412341233","id_bank":4,"nom_emetteur":"Djery","prenom_emetteur":"Tom","email_emetteur":"ddietchi@ilink-app.com","type_document_emetteur":"passport","id_document_emetteur":"12345","nom_destinataire":"Brice","prenom_destinataire":"zele","montant":100000,"password":"1234"}
* },
* }
* )
* ),
* @OA\Response(
* response=200,
* description="OK",
* @OA\MediaType(
* mediaType="application/json",
* @OA\Schema(
* oneOf={
* @OA\Schema(ref="#/components/schemas/user_payement_of_operator_frame"),
* @OA\Schema(ref="#/components/schemas/user_remove_from_bank_to_wallet_frame"),
* @OA\Schema(ref="#/components/schemas/user_send_from_wallet_to_bank_frame"),
* @OA\Schema(ref="#/components/schemas/agent_send_from_cash_to_bank_frame"),
* }
* ),
* examples = {
* "user_payement_of_operator" : {
* "summary" : "User - Payer une facture chez un opérateur donné",
* "value" : {
* "status" : 200,
* "response" : "Paiement d'une facture chez un operateur\nInformations de la transaction :\n - Numéro : 7S9PZO26VAQ3\n - Montant de la transaction : 100000 FCFA\n
- Frais : 0 FCFA\n - Montant net payé: 100000 FCFA\n - Compte émetteur : s6LD9PmCJC\n - Operateur : CDE\n - Type d'operateur : Opérateur d'eau\n - No facture : CDE1425533\n\nCe message a été envoyé dans le mail de l'émetteur",
* "error":null
* }
* },
* "user_remove_from_bank_to_wallet" : {
* "summary" : "User - Retrait du compte bancaire rattaché vers le wallet de l'utilisateur",
* "value" : {
* "status" : 200,
* "response" : "Retrait de la banque vers le wallet\nInformations de la transaction :\n - Numéro : 2XWQD7ZD9E7R\n - Montant de la transaction : 100000 FCFA\n
- Frais : 0 FCFA\n - Montant net d\\'envoi: 100000 FCFA\n - Compte émetteur : BZdsWkdfl\n - Banque : UBA Cameroon\n - IBAN : \n\nCe message a été envoyé dans le mail de l'émetteur",
* "error":null
* }
* },
* "user_send_from_wallet_to_bank" : {
* "summary" : "User - Envoi de wallet à banque",
* "value" : {
* "status" : 200,
* "response" : "Envoi d'argent de votre compte vers la banque\nInformations de la transaction :\n - Numéro : NA69C5RTBY7B\n - Montant de la transaction : 100000 FCFA\n
- Frais : 0 FCFA\n - Montant net d'envoi: 100000 FCFA\n - Compte émetteur : s6LD9PmCJC\n - Banque : UBA Cameroon\n - IBAN : \n\nCe message a été envoyé dans le mail de l'émetteur",
* "error":null
* }
* },
* "agent_send_from_cash_to_bank" : {
* "summary" : "Agent - Envoi de cash vers banque",
* "value" : {
* "status" : 200,
* "response" : "Envoi d'argent en cash vers la banque\nInformations de la transaction :\n - Numéro : E58K8ZFPB5AN\n - Montant de la transaction : 100000 FCFA\n - Frais : 0 FCFA\n - Montant net d'envoi: 100000 FCFA\n
- Compte de l'agent : 38LEDBostp\n - Noms de l'emetteur : Tom Djery\n - Noms du destinataire : zele Brice\n - IBAN du destinataire : CM15UBAA412341234123412341233\n - Banque : UBA Cameroon\n\nCe message a été envoyé dans le mail de l'émetteur",
* "error":null
* }
* },
* }
* )
* )
* )
*/
// Transactions dans le wallet iLink
public function add(Request $request)
{
$transaction = new WalletIlinkTransaction();
$this->validate($request, [
'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',
'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);
$transaction->init_country = $init_country = $network_agent->network->country->id;
// 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);
} elseif (isset($request->id_wallet_user)) {
$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);
} else {
return $this->errorResponse(trans('errors.no_ilink_network'));
}
$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);
}
$transaction->network_emetteur = $config->id_network;
$taxesNationales = array_values(array_filter($config->taxes->all(), function ($tax) {
return $tax->destination == 'national' && $tax->categorie == 'wallet';
}));
$taxesInternationales = array_values(array_filter($config->taxes->all(), function ($tax) {
return $tax->destination == 'international' && $tax->categorie == 'wallet';
}));
$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
$this->validate($request, $transaction->send_wallet_wallet_rules());
$user = $walletUser->user;
if ($this->checkPassword($request->password, $user->encrypted_password, $user->salt)) {
if ($init_country != $request->final_country) {
$rep = $this->checkUserIdentification($user->id);
// dd($rep);
if ($rep instanceof JsonResponse)
return $rep;
}
if ($request->montant > $walletUser->balance) {
return $this->errorResponse(trans('errors.insufficient_balance'));
} else {
//Verification des limites reglementaires
$rep = $this->checkReguationsLimits($walletUser->id, $init_country, $request->final_country, $transaction->montant);
if ($rep instanceof JsonResponse)
return $rep;
$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_net = $montantDepot = $transaction->montant - $frais - $taxe;
$transaction->montant_net_final_country = $this->toMoneyAmount($montantDepot, $init_country, $request->final_country);
$configPayeur = ConfigWallet::where('id_network', $request->network_destinataire)->firstOrFail();
$reseauPayeur = PayingNetwork::where('id_network', $request->network_destinataire)->where('id_configWallet', $config->id)->first();
if (isset($reseauPayeur)) {
$transaction->part_reseau_payeur = $frais * $reseauPayeur->taux_partage / 100;
$transaction->part_reseau_payeur_final_country = $this->toMoneyAmount($transaction->part_reseau_payeur, $init_country, $request->final_country);
$transaction->part_reseau_emetteur = $frais - $transaction->part_reseau_payeur;
} else {
$transaction->part_reseau_payeur = 0;
$transaction->part_reseau_payeur_final_country = 0;
$transaction->part_reseau_emetteur = $frais;
}
$transaction->commission_hyp = $transaction->part_reseau_emetteur;
$transaction->id_transaction = $this->getTransactionID();
if ($configPayeur->type == 'ilink') {
$destinataire = User::where('user_code', $request->id_destinataire)->first();
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 += $this->toMoneyAmount($montantDepot, $init_country, $request->final_country);
$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'));
}
//Mise a jour des comissions et compensation
if (isset($reseauPayeur)) {
$reseauPayeur->balance_com += $transaction->part_reseau_payeur_final_country;
$reseauPayeur->balance_compensation += $transaction->montant_net_final_country;
}
//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
$transaction->id_wallet_hyp_payeur = $walletHyperviseur->id;
} else {
$wallet_agent_hypPayeur = WalletAgent::where('agent_id', $hyperviseurPayeur->id)->firstOrFail();
$walletHyperviseurPayeur = Wallet::findOrFail($wallet_agent_hypPayeur->wallet_id);
$walletHyperviseurPayeur->balance_com += $this->toMoneyAmount($transaction->part_reseau_payeur, $init_country, $request->final_country);
$transaction->id_wallet_hyp_payeur = $walletHyperviseurPayeur->id;
$walletHyperviseurPayeur->save();
}
} else {
//Emettre requete SSL vers wallet extene correspondant pour recharger le compte du destinataire
// La mise à jour des comissions de compensation se fera lors du traitement de la transaction
$transaction->status_reseau_payeur = 'EN_COURS';
$result = $this->sendFrame($this->PAYING_NETWORK_SIMULATOR_SEND_FRAME_URL, $transaction);
if ($result->getStatusCode() != 200)
return $this->errorResponse(trans('errors.unexpected_error'));
}
$walletHyperviseur->balance_com += $transaction->part_reseau_emetteur;
$walletUser->balance -= $transaction->montant;
$transaction->id_wallet_hyp = $walletHyperviseur->id;
$walletHyperviseur->save();
$walletUser->save();
if (isset($reseauPayeur))
$reseauPayeur->save();
$transaction->date = $this->getCurrentTime($init_country);
$transaction->save();
$message = trans('messages.successful_user_send_to_wallet',
['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country), 'net_init' => $this->toMoney($montantDepot, $init_country),
'net_final' => $this->toMoneyWithCurrency($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, 'network' => $this->getNetworkName($transaction->network_destinataire)]);
$this->sendMail($user->email, trans('messages.successful_transaction'), $message);
return $this->successResponse($message . trans('messages.sent_by_mail'));
}
} else {
return $this->errorResponse(trans('messages.incorrect_user_password'));
}
break;
case 2: //User - Envoi de wallet à carte
$this->validate($request, $transaction->user_card_rules());
$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'));
} else {
if (!(isset($user->numero_carte) && isset($user->expiration_date)))
return $this->errorResponse(trans('errors.no_bank_card_attached'));
$transaction->expiration_date = $user->expiration_date;
$transaction->numero_carte = $user->numero_carte;
$frais = $request->montant * $config->taux_com_user_wallet_carte / 100;
$transaction->montant_net = $montantDepot = $transaction->montant - $frais;
// $body['amount'] = $this->toUSDAmount($montantDepot, $init_country);
$body['card_number'] = $user->numero_carte;
$body['cvv'] = $request->cvv;
// $body['expiry_date'] = $user->expiration_date->format('Y-m');
$body['expiry_date'] = $user->expiration_date->format('m/y');
$body['amount'] = $montantDepot;
$identification = Identification::where('id_user', $user->id)->first();
$body['cardholder_name'] = $identification ? $identification->lastname . ' ' . $identification->firstname : $user->lastname . ' ' . $user->firstname; //"John Smith" ;
$body['currency'] = $this->getCurrency($init_country);
$body['ref'] = date("Y-m-d H:i:s.u");
$response = $client->post($this->PAYOUT_URL, ['json' => $body, 'http_errors' => false]);
$code = $response->getStatusCode();
if ($code == 200) {
$response = json_decode($response->getBody()->getContents(), true)["response"];
$transaction->pspReference = $response["pspReference"];
$walletUser->balance -= $transaction->montant;
//Emettre une trame SSL pour recharger le compte de la banque partenaire du montant de sa commission
$transaction->commission_banque = $frais * $config->taux_com_banque_envoi_wallet_carte_ilink / 100;
$transaction->commission_hyp = $frais * $config->taux_com_hyp_envoi_wallet_carte_ilink / 100;
$walletHyperviseur->balance_com += $transaction->commission_hyp;
$transaction->id_wallet_hyp = $walletHyperviseur->id;
$transaction->frais = $frais;
$transaction->date = new \DateTime();
$walletHyperviseur->save();
$walletUser->save();
$transaction->id_transaction = $this->getTransactionID();
$transaction->date = $this->getCurrentTime($init_country);
$transaction->save();
$message = trans('messages.successful_user_send_to_cart',
['id_transaction' => $transaction->id_transaction, '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($transaction->numero_carte, 4, ' ', true)]);
$this->sendMail($user->email, trans('messages.successful_transaction'), $message);
return $this->successResponse($message . trans('messages.sent_by_mail'));
} else {
return $this->errorResponse(trans('errors.visa_api_failed'));
}
}
} else {
return $this->errorResponse(trans('messages.incorrect_user_password'));
}
break;
case 3: //User - Envoi de wallet à cash
$this->validate($request, $transaction->send_wallet_cash_rules());
$user = $walletUser->user;
if ($this->checkPassword($request->password, $user->encrypted_password, $user->salt)) {
if ($init_country != $request->final_country) {
$rep = $this->checkUserIdentification($user->id);
if ($rep instanceof JsonResponse)
return $rep;
}
if ($request->montant > $walletUser->balance) {
return $this->errorResponse(trans('errors.insufficient_balance'));
} else {
//Verification des limites reglementaires
$rep = $this->checkReguationsLimits($walletUser->id, $init_country, $request->final_country, $transaction->montant);
if ($rep instanceof JsonResponse)
return $rep;
$transaction->frais = $frais = ($init_country != $request->final_country) ? $this->calculateFees($plr_user_wallet_cash, $request->montant) : $this->calculateFees($plr_user_wallet_cash_national, $request->montant);
$transaction->taxe = $taxe = ($init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais);
$transaction->montant_net = $montantRetrait = $transaction->montant - $frais - $taxe;
$transaction->montant_net_final_country = $this->toMoneyAmount($montantRetrait, $init_country, $request->final_country);
$configPayeur = ConfigWallet::where('id_network', $request->network_destinataire)->firstOrFail();
$reseauPayeur = PayingNetwork::where('id_network', $request->network_destinataire)->where('id_configWallet', $config->id)->first();
if (isset($reseauPayeur)) {
$transaction->part_reseau_payeur = $frais * $reseauPayeur->taux_partage / 100;
$transaction->part_reseau_payeur_final_country = $this->toMoneyAmount($transaction->part_reseau_payeur, $init_country, $request->final_country);
$transaction->part_reseau_emetteur = $frais - $transaction->part_reseau_payeur;
} else {
$transaction->part_reseau_payeur = 0;
$transaction->part_reseau_payeur_final_country = 0;
$transaction->part_reseau_emetteur = $frais;
}
$transaction->commission_hyp = $transaction->part_reseau_emetteur;
$transaction->commission_hyp_final_country = $this->toMoneyAmount($transaction->commission_hyp, $init_country, $request->final_country);
$transaction->id_transaction = $this->getTransactionID();
if ($configPayeur->type == 'ilink') {
//Mise a jour des comissions et compensation
if (isset($reseauPayeur)) {
$reseauPayeur->balance_com += $transaction->part_reseau_payeur_final_country;
$reseauPayeur->balance_compensation += $transaction->montant_net_final_country;
}
//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
$transaction->id_wallet_hyp_payeur = $walletHyperviseur->id;
} else {
$wallet_agent_hypPayeur = WalletAgent::where('agent_id', $hyperviseurPayeur->id)->firstOrFail();
$walletHyperviseurPayeur = Wallet::findOrFail($wallet_agent_hypPayeur->wallet_id);
$walletHyperviseurPayeur->balance_com += $this->toMoneyAmount($transaction->part_reseau_payeur, $init_country, $request->final_country);
$transaction->id_wallet_hyp_payeur = $walletHyperviseurPayeur->id;
$walletHyperviseurPayeur->save();
}
} else {
//Emettre requete SSL vers wallet extene correspondant pour recharger le compte du destinataire
// La mise à jour des comissions de compensation se fera lors du traitement de la transaction
$transaction->status_reseau_payeur = 'EN_COURS';
$result = $this->sendFrame($this->PAYING_NETWORK_SIMULATOR_SEND_FRAME_URL, $transaction);
if ($result->getStatusCode() != 200)
return $this->errorResponse(trans('errors.unexpected_error'));
}
$walletUser->balance -= $transaction->montant;
$walletHyperviseur->balance_com += $transaction->commission_hyp;
$code_retrait = $this->random_string();
$hash = $this->hashSSHA($code_retrait);
$transaction->encrypted_code_retrait = $hash['encrypted'];
$transaction->code_retrait_salt = $hash['salt'];
$transaction->id_wallet_hyp = $walletHyperviseur->id;
if (isset($reseauPayeur))
$reseauPayeur->save();
$walletHyperviseur->save();
$walletUser->save();
$transaction->date = $this->getCurrentTime($init_country);
$transaction->status_retrait = 0;
$transaction->save();
$message = trans('messages.successful_user_send_to_cash',
['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country), 'net_init' => $this->toMoney($montantRetrait, $init_country),
'net_final' => $this->toMoneyWithCurrency($montantRetrait, $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), 'code' => wordwrap($code_retrait, 4, ' ', true),
'sender_code' => $user->user_code, 'receiver_code' => $transaction->id_destinataire, 'receiver_name' => $request->prenom_destinataire . ' ' . $request->nom_destinataire,
'sender_name' => $user->lastname . ' ' . $user->firstname, 'network' => $this->getNetworkName($transaction->network_destinataire)]);
$this->sendMail($user->email, trans('messages.successful_transaction'), $message);
return $this->successResponse($message . trans('messages.sent_by_mail'));
}
} else {
return $this->errorResponse(trans('messages.incorrect_user_password'));
}
break;
/**
* @OA\Schema(
* schema="user_send_from_wallet_to_bank",
* title = "User - Envoi de wallet à banque",
* @OA\Property(property="type",
* type="integer",
* enum = {4},
* default = 4,
* description="Type de la transaction"
* ),
* @OA\Property(property="id_wallet_user",
* type="integer",
* example=9,
* description="ID du wallet de l'utilisateur enregistré dans la base de données"
* ),
* @OA\Property(property="id_wallet_network",
* type="integer",
* example=101,
* description="ID du reseau enregistré dans la base de données auquel appartient le wallet"
* ),
* @OA\Property(property="montant",
* type="number",
* example = 10000,
* description="Montant de la transaction"
* ),
* @OA\Property(property="password",
* type="string",
* description="Mot de passe"
* )
* )
*/
/**
* @OA\Schema(
* schema="user_send_from_wallet_to_bank_frame",
* title = "User - Envoi de wallet à banque - Trame envoyé",
* @OA\Property(property="type",
* type="integer",
* default = 4,
* description="Type de la transaction"
* ),
* * @OA\Property(property="id_wallet_user",
* type="integer",
* example=9,
* description="ID du wallet de l'utilisateur enregistré dans la base de données"
* ),
* @OA\Property(property="network_emetteur",
* type="integer",
* example=101,
* description="ID du reseau enregistré dans la base de données auquel appartient le wallet"
* ),
* @OA\Property(property="iban",
* type="string",
* example = "CM15UBAA412341234123412341233",
* description="ID bancaire de l'utilisateur"
* ),
* @OA\Property(property="id_bank",
* type="integer",
* example = 16,
* description="ID de la banque dans la base de données"
* ),
* @OA\Property(property="bank",
* type="string",
* default="UBA",
* description="Nom de la banque"
* ),
* @OA\Property(property="country",
* type="string",
* default="Cameroon",
* description="Pays où la transaction été éfféctuée"
* ),
* @OA\Property(property="montant",
* type="number",
* example = 10000,
* description="Montant de la transaction"
* ),
* @OA\Property(property="frais",
* type="number",
* example = 100,
* description="Montant des frais de la transaction"
* ),
* @OA\Property(property="taxe",
* type="number",
* example = 50,
* description="Montant des taxes de la transaction"
* ),
* @OA\Property(property="commission_hyp",
* type="number",
* example = 25,
* description="Montant de la commission de l'hyperviseur du réseau sur la transaction"
* ),
* @OA\Property(property="commission_banque",
* type="number",
* example = 25,
* description="Montant de la commission de la banque sur le réseau sur la transaction"
* ),
* @OA\Property(property="date",
* type="string",
* example = "2020-11-30T08:57:57.000000Z",
* description="Date à laquelle la transaction a été éffectuée"
* )
* )
*/
case 4: //User - Envoi de wallet à banque
$this->validate($request, [
'id_wallet_network' => 'required|integer|min:0|not_in:0',
]);
$user = $walletUser->user;
if (!$this->checkPassword($request->password, $user->encrypted_password, $user->salt))
return $this->errorResponse(trans('messages.incorrect_user_password'));
$rep = $this->checkUserIdentification($user->id);
if ($rep instanceof JsonResponse)
return $rep;
if (!(isset($user->iban) && isset($user->id_bank_country)))
return $this->errorResponse(trans('errors.wallet_not_linked_to_bank_account'));
if ($request->montant > $walletUser->balance)
return $this->errorResponse(trans('errors.insufficient_balance'));
//Reverifier si l'operateur est toujours associé au reseau
$network_bank = NetworksOperator::where('id_network', $request->id_wallet_network)->where('id_operator_country', $user->id_bank_country)->first();
if (!$network_bank)
return $this->errorResponse(trans('errors.operator_not_associated_with_network') . '. ' . trans('errors.update_banking_information'));
if ($network_bank->operators_country->operator->type != 'bank')
return $this->errorResponse(trans('errors.not_banking_operator') . '. ' . trans('errors.update_banking_information'));
//Reverifier le code IBAN correspond toujours
$country_code = $network_bank->network->country->code_country;
$bank_code = $network_bank->operators_country->code;
switch ($this->checkIBAN($user->iban, $country_code, $bank_code)) {
case 0:
return $this->errorResponse(trans('errors.invalid_iban') . '. ' . trans('errors.update_banking_information'));
case 1:
return $this->errorResponse(trans('errors.country_not_match_iban') . '. ' . trans('errors.update_banking_information'));
case 2:
return $this->errorResponse(trans('errors.bank_not_match_iban') . '. ' . trans('errors.update_banking_information'));
}
$transaction->frais = $frais = 0;
$transaction->taxe = $taxe = 0;
// $walletUser->balance -= $transaction->montant;
//Emettre une trame SSL pour recharger le compte bancaire du montant de la transaction
$transaction->commission_banque = 0;
$transaction->commission_hyp = 0;
$transaction->id_wallet_hyp = $walletHyperviseur->id;
$transaction->frais = $frais;
$transaction->date = new \DateTime();
$transaction->bank = $user->bank->operators_country->operator->nom;
$transaction->country = $user->bank->network->country->name;
$transaction->id_bank = $user->id_bank_country;
$transaction->iban = $user->iban;
$transaction->date = $this->getCurrentTime($init_country);
// $walletUser->save();
$transaction->id_transaction = $this->getTransactionID();
// $transaction->save();
Log::info('-------------------------- User - Envoi de wallet à banque ------------------------------------');
Log::info($transaction->toArray());
Log::info('------------------------------------------------------------------------------------------------');
$message = trans('messages.successful_user_send_to_bank',
['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country),
'net' => $this->toMoney($transaction->montant, $init_country), 'iban' => $request->iban, 'fees' => $this->toMoney($frais, $init_country),
'sender_code' => $user->user_code, 'bank' => $transaction->bank, 'country' => $transaction->country]);
$this->sendMail($user->email, trans('messages.successful_transaction'), $message);
return $this->successResponse($message . trans('messages.sent_by_mail'));
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
$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'));
} else {
$rep = $this->checkUserIdentification($user->id);
if ($rep instanceof JsonResponse)
return $rep;
$transaction->final_country = $init_country;
$transaction->frais = $frais = $this->calculateFees($plr_user_wallet_cash_national, $request->montant);
$transaction->taxe = $taxe = $this->calculateTax($taxesNationales, $frais);
$transaction->montant_net_final_country = $transaction->montant_net = $montantRetrait = $transaction->montant - $frais - $taxe;
$transaction->commission_hyp_final_country = $transaction->commission_hyp = $frais;
$walletUser->balance -= $transaction->montant;
$walletHyperviseur->balance_com += $transaction->commission_hyp;
$code_retrait = $this->random_string();
$hash = $this->hashSSHA($code_retrait);
$transaction->encrypted_code_retrait = $hash['encrypted'];
$transaction->code_retrait_salt = $hash['salt'];
$transaction->id_wallet_hyp = $walletHyperviseur->id;
$transaction->id_transaction = $this->getTransactionID();
$walletHyperviseur->save();
$walletUser->save();
$transaction->date = $this->getCurrentTime($init_country);
$transaction->status_retrait = 0;
$transaction->save();
$message = trans('messages.successful_user_remove_from_wallet_to_cash',
['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country), 'net' => $this->toMoney($montantRetrait, $init_country),
'fees' => $this->toMoney($frais + $taxe, $init_country), 'code' => wordwrap($code_retrait, 4, ' ', true),
'sender_code' => $user->user_code, 'init_country' => $this->getCountryName($init_country),]);
$this->sendMail($user->email, trans('messages.successful_transaction'), $message);
return $this->successResponse($message . trans('messages.sent_by_mail'));
}
} else {
return $this->errorResponse(trans('messages.incorrect_user_password'));
}
break;
case 10: //User - Retrait de carte vers wallet
$this->validate($request, $transaction->user_card_rules());
$user = $walletUser->user;
if ($this->checkPassword($request->password, $user->encrypted_password, $user->salt)) {
if (!(isset($user->numero_carte) && isset($user->expiration_date)))
return $this->errorResponse(trans('errors.no_bank_card_attached'));
$transaction->expiration_date = $user->expiration_date;
$transaction->numero_carte = $user->numero_carte;
$frais = $request->montant * $config->taux_com_user_carte_wallet / 100;
$transaction->montant_net = $montantRetrait = $transaction->montant + $frais;
// $body['amount'] = $this->toUSDAmount($montantRetrait, $init_country);
$body['card_number'] = $user->numero_carte;
$body['cvv'] = $request->cvv;
// $body['expiry_date'] = $user->expiration_date->format('Y-m');
$body['expiry_date'] = $user->expiration_date->format('m/y');
$body['amount'] = $montantRetrait;
$identification = Identification::where('id_user', $user->id)->first();
$body['cardholder_name'] = $identification ? $identification->lastname . ' ' . $identification->firstname : $user->lastname . ' ' . $user->firstname; //"John Smith" ;
$body['currency'] = $this->getCurrency($init_country);
$body['ref'] = date("Y-m-d H:i:s.u");
// dd($body);
$response = $client->post($this->PAYMENT_URL, ['json' => $body, 'http_errors' => false]);
$code = $response->getStatusCode();
if ($code == 200) {
$response = json_decode($response->getBody()->getContents(), true)["response"];
$transaction->pspReference = $response["pspReference"];
$transaction->commission_banque = $commissionBanque = $frais * $config->taux_com_banque_retrait_carte_cash_ilink / 100;
//Emettre une trame SSL pour recharger le compte de la banque partenaire du montant de sa commission
$walletUser->balance += $transaction->montant;
$transaction->commission_hyp = $frais * $config->taux_com_hyp_retrait_carte_cash_ilink / 100;
$walletHyperviseur->balance_com += $transaction->commission_hyp;
$transaction->id_wallet_hyp = $walletHyperviseur->id;
$transaction->frais = $frais;
$transaction->date = new \DateTime();
$walletHyperviseur->save();
$walletUser->save();
$transaction->id_transaction = $this->getTransactionID();
$transaction->date = $this->getCurrentTime($init_country);
$transaction->save();
$message = trans('messages.successful_user_remove_from_cart_to_wallet',
['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country),
'total' => $this->toMoney($montantRetrait, $init_country), 'fees' => $this->toMoney($frais, $init_country),
'sender_code' => $user->user_code, 'cart_number' => wordwrap($transaction->numero_carte, 4, ' ', true)]);
$this->sendMail($user->email, trans('messages.successful_transaction'), $message);
return $this->successResponse($message . trans('messages.sent_by_mail'));
} else {
return $this->errorResponse(trans('errors.visa_api_failed'));
}
} else {
return $this->errorResponse(trans('messages.incorrect_user_password'));
}
break;
case 11: // User - Retrait de carte vers cash
$this->validate($request, $transaction->user_card_rules());
$user = $walletUser->user;
if ($this->checkPassword($request->password, $user->encrypted_password, $user->salt)) {
$rep = $this->checkUserIdentification($user->id);
if ($rep instanceof JsonResponse)
return $rep;
if (!(isset($user->numero_carte) && isset($user->expiration_date)))
return $this->errorResponse(trans('errors.no_bank_card_attached'));
$transaction->expiration_date = $user->expiration_date;
$transaction->numero_carte = $user->numero_carte;
$transaction->final_country = $init_country;
$frais = $request->montant * $config->taux_com_user_carte_cash / 100;
$transaction->montant_net = $montantRetrait = $transaction->montant + $frais;
$transaction->montant_net_final_country = $transaction->montant;
// $body['amount'] = $this->toUSDAmount($montantRetrait, $init_country);
$body['card_number'] = $user->numero_carte;
$body['cvv'] = $request->cvv;
// $body['expiry_date'] = $user->expiration_date->format('Y-m');
$body['expiry_date'] = $user->expiration_date->format('m/y');
$body['amount'] = $montantRetrait;
$identification = Identification::where('id_user', $user->id)->first();
$body['cardholder_name'] = $identification ? $identification->lastname . ' ' . $identification->firstname : $user->lastname . ' ' . $user->firstname; //"John Smith" ;
$body['currency'] = $this->getCurrency($init_country);
$body['ref'] = date("Y-m-d H:i:s.u");
$response = $client->post($this->PAYMENT_URL, ['json' => $body, 'http_errors' => false]);
$code = $response->getStatusCode();
if ($code == 200) {
$response = json_decode($response->getBody()->getContents(), true)["response"];
$transaction->pspReference = $response["pspReference"];
$transaction->commission_banque = $commissionBanque = $frais * $config->taux_com_banque_retrait_carte_cash_ilink / 100;
//Emettre une trame SSL pour recharger le compte de la banque partenaire du montant de sa commission
$code_retrait = $this->random_string();
$hash = $this->hashSSHA($code_retrait);
$transaction->encrypted_code_retrait = $hash['encrypted'];
$transaction->code_retrait_salt = $hash['salt'];
$transaction->commission_hyp = $frais * $config->taux_com_hyp_retrait_carte_cash_ilink / 100;
$walletHyperviseur->balance_com += $transaction->commission_hyp;
$transaction->id_wallet_hyp = $walletHyperviseur->id;
$transaction->frais = $frais;
$transaction->date = $this->getCurrentTime($init_country);
$transaction->status_retrait = 0;
$walletHyperviseur->save();
$transaction->id_transaction = $this->getTransactionID();
$transaction->save();
$message = trans('messages.successful_user_remove_from_cart_to_cash',
['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country),
'final_country' => $this->getCountryName($init_country), 'init_country' => $this->getCountryName($init_country),
'total' => $this->toMoney($transaction->montant, $init_country), 'fees' => $this->toMoney($frais, $init_country), 'code' => wordwrap($code_retrait, 4, ' ', true),
'sender_code' => $user->user_code, 'cart_number' => wordwrap($transaction->numero_carte, 4, ' ', true)]);
$this->sendMail($user->email, trans('messages.successful_transaction'), $message);
return $this->successResponse($message . trans('messages.sent_by_mail'));
} else {
return $this->errorResponse(trans('errors.visa_api_failed'));
}
} else {
return $this->errorResponse(trans('messages.incorrect_user_password'));
}
break;
case 12: // Agent - Retrait en cash
$this->validate($request, $transaction->remove_cash_rules());
$agent = AgentPlus::findOrFail($network_agent->agent_id);
if ($this->checkPassword($request->password, $agent->encrypted_password, $agent->salt)) {
$transaction = WalletIlinkTransaction::where('id_transaction', $request->id_transaction)->first();
if ($transaction) {
//Verifier si l'agent qui a effectué l'envoi de cash à cash ne puisse pas retirer l'argent
if ($transaction->type == 17)
if ($transaction->id_wallet_ag == $walletAgent->id)
return $this->errorResponse(trans('errors.agent_unauthorized'));
//Verifier que le reseau payeur est de type iLink
if (in_array($transaction->type, [3, 17])) {
$configPayeur = ConfigWallet::where('id_network', $transaction->network_destinataire)->firstOrFail();
if ($configPayeur->type != 'ilink')
return $this->errorResponse(trans('errors.withdrawal_network_unauthorized', ['network' => $this->getNetworkName($transaction->network_destinataire),
'country' => $this->getCountryName($transaction->final_country)]));
}
if ($transaction->status_retrait == 0) {
//Verifier que le pays de destinatation correspond au pays de retrait
if ($init_country != $transaction->final_country)
return $this->errorResponse(trans('errors.operation_cannot_performed_in_country'));
if ($this->checkPassword($request->code_retrait, $transaction->encrypted_code_retrait, $transaction->code_retrait_salt)) {
$montantNet = $transaction->type == 11 ? $transaction->montant_net : $transaction->montant_net_final_country;
if (in_array($transaction->type, [3, 17])) {
$commissionHyp = ($transaction->network_emetteur != $transaction->network_destinataire) ?
$transaction->part_reseau_payeur_final_country : $transaction->commission_hyp_final_country;
} else {
$commissionHyp = $transaction->type == 11 ? $transaction->commission_hyp : $transaction->commission_hyp_final_country;
}
if ($montantNet == $request->montant) {
$transactionRetrait = $transaction->replicate();
$transactionRetrait->id = null;
$transactionRetrait->type = $request->type;
$transactionRetrait->id_transaction = $this->getTransactionID();
$transactionRetrait->montant = $montantNet;
$emailEmetteur = $transaction->wallet_user ? $transaction->wallet_user->user->email : $transaction->email_emetteur;
$emetteur = $transaction->wallet_user ? $transaction->wallet_user->user->lastname . ' ' . $transaction->wallet_user->user->firstname : $transaction->prenom_emetteur . ' ' . $transaction->nom_emetteur;
$destinataire = in_array($transaction->type, [9, 11]) ? $emetteur : $transaction->prenom_destinataire . ' ' . $transaction->nom_destinataire;
$transactionRetrait->commission_ag = floatval($commissionHyp * $config->taux_com_ag_retrait_cash / 100);
$transactionRetrait->commission_sup = floatval($commissionHyp * $config->taux_com_sup_retrait_cash / 100);
$transactionRetrait->commission_hyp = $commissionHyp - $transactionRetrait->commission_ag - $transactionRetrait->commission_sup;
$walletAgent->balance_princ += $montantNet;
$walletAgent->balance_com += $transactionRetrait->commission_ag;
$walletSuperviseur->balance_com += $transactionRetrait->commission_sup;
$walletHyperviseur->balance_com -= ($transactionRetrait->commission_ag + $transactionRetrait->commission_sup);
$transactionRetrait->id_wallet_ag = $walletAgent->id;
$transactionRetrait->id_wallet_sup = $walletSuperviseur->id;
$transactionRetrait->id_wallet_hyp = $walletHyperviseur->id;
$transactionRetrait->status_retrait = $transactionRetrait->commission_banque = $transactionRetrait->code_retrait_salt = $transactionRetrait->encrypted_code_retrait = null;
$transactionRetrait->frais = $transactionRetrait->taxe = 0;
$transaction->status_retrait = 1;
$transaction->date_retrait = $this->getCurrentTime($init_country);
$transaction->date = $this->getCurrentTime($init_country);
//Si la transaction provient du reseau emetteur
if ($transaction->from_network_emetteur) {
$transaction->status_reseau_payeur = 'TRAITEE';
}
$walletAgent->save();
$walletSuperviseur->save();
$walletHyperviseur->save();
$transaction->save();
$transactionRetrait->save();
$message = trans('messages.successful_agent_remove_cash',
['id_transaction' => $transactionRetrait->id_transaction, 'amount' => $this->toMoney($request->montant, $init_country), 'init_country' => $this->getCountryName($transaction->init_country),
'code' => wordwrap($request->code_retrait, 4, ' ', true), 'final_country' => $this->getCountryName($transaction->final_country),
'sender_name' => $emetteur, 'receiver_name' => $destinataire, 'id_transaction_retrait' => $transaction->id_transaction]);
$this->sendMail($emailEmetteur, trans('messages.successful_transaction'), $message);
return $this->successResponse($message . trans('messages.sent_by_mail'));
} else {
return $this->errorResponse(trans('errors.incorrect_withdrawal_amount'));
}
} else {
return $this->errorResponse(trans('errors.invalid_withdrawal_code'));
}
} else {
return $this->errorResponse(trans('errors.withdrawal_already_made'));
}
} else {
return $this->errorResponse(trans('errors.transaction_not_exist'), Response::HTTP_NOT_FOUND);
}
} 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;
$transaction->final_country = $init_country;
$frais = floatval($request->montant * $config->taux_com_wallet_ag_carte_cash / 100);
$montantRetrait = $transaction->montant + $frais;
$transaction->montant_net = $montantRetrait;
// $body['amount'] = $this->toUSDAmount($montantRetrait, $init_country);
$body['card_number'] = $request->numero_carte;
$body['cvv'] = $request->cvv;
// $body['expiry_date'] = $expiration_date->format('Y-m');
$body['expiry_date'] = $expiration_date->format('m/y');
$body['amount'] = $montantRetrait;
$body['cardholder_name'] = $request->lastname ? $request->lastname . ' ' . $request->firstname : "John Smith";
$body['currency'] = $this->getCurrency($init_country);
$body['ref'] = date("Y-m-d H:i:s.u");
$response = $client->post($this->PAYMENT_URL, ['json' => $body, 'http_errors' => false]);
$code = $response->getStatusCode();
if ($code == 200) {
$response = json_decode($response->getBody()->getContents(), true)["response"];
$transaction->pspReference = $response["pspReference"];
$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ôt qui 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 = $this->getCurrentTime($init_country);
$walletAgent->save();
$walletSuperviseur->save();
$walletHyperviseur->save();
$transaction->id_transaction = $this->getTransactionID();
$transaction->save();
return $this->successResponse(trans('messages.successful_transaction'));
} else {
return $this->errorResponse(trans('errors.visa_api_failed'));
}
} 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());
$agent = AgentPlus::findOrFail($network_agent->agent_id);
if ($this->checkPassword($request->password, $agent->encrypted_password, $agent->salt)) {
$user = User::where('user_code', $request->user_code)->first();
if (!$user)
return $this->errorResponse(trans('errors.wallet_not_defined'));
$transaction->id_destinataire = $request->user_code;
$walletUser = WalletsUser::where('idUser', $user->id)->firstOrFail();
$transaction->final_country = $final_country = $user->network->country->id;
//Verification des limites reglementaires
$rep = $this->checkReguationsLimits($walletUser->id, $init_country, $final_country, $transaction->montant);
if ($rep instanceof JsonResponse)
return $rep;
$frais = ($init_country != $final_country) ? $this->calculateFees($plr_agent_depot_wallet_ilink, $request->montant) : $this->calculateFees($plr_agent_depot_wallet_ilink_national, $request->montant);
$taxe = ($init_country != $final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais);
$montantDepot = $request->montant - $frais - $taxe;
$transaction->montant_net = $montantDepot;
$transaction->montant_net_final_country = $this->toMoneyAmount($montantDepot, $init_country, $final_country);
$walletUser->balance += $transaction->montant_net_final_country;
$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);
$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 = $this->getCurrentTime($init_country);
$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->id_transaction = $this->getTransactionID();
$transaction->save();
$message = trans('messages.successful_agent_deposit_wallet_ilink',
['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country), 'net_init' => $this->toMoney($montantDepot, $init_country),
'net_final' => $this->toMoneyWithCurrency($montantDepot, $init_country, $final_country), 'fees' => $this->toMoney($frais + $taxe, $init_country), 'init_country' => $this->getCountryName($init_country),
'final_country' => $this->getCountryName($final_country), 'user_code' => $request->user_code]);
$this->sendMail($user->email, trans('messages.successful_transaction'), $message);
return $this->successResponse($message . trans('messages.sent_by_mail'));
} else {
return $this->errorResponse(trans('messages.incorrect_user_password'));
}
break;
case 15: // Agent - Envoi de cash vers autre wallet
$this->validate($request, array_merge($transaction->cash_cash_rules(), [
'id_destinataire' => 'required'
]));
$agent = AgentPlus::findOrFail($network_agent->agent_id);
if ($this->checkPassword($request->password, $agent->encrypted_password, $agent->salt)) {
if ($request->montant > $walletAgent->balance_princ)
return $this->errorResponse(trans('errors.insufficient_balance'));
//Verification des limites reglementaires
$rep = $this->checkReguationsLimits($request->id_document_emetteur, $init_country, $request->final_country, $transaction->montant, true);
if ($rep instanceof JsonResponse)
return $rep;
$frais = ($init_country != $request->final_country) ? $this->calculateFees($plr_agent_depot_autre_wallet, $request->montant) : $this->calculateFees($plr_agent_depot_autre_wallet_national, $request->montant);
$taxe = ($init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais);
$montantDepot = $request->montant - $frais - $taxe;
$transaction->montant_net = $montantDepot;
$transaction->montant_net_final_country = $this->toMoneyAmount($montantDepot, $init_country, $request->final_country);
$reseauPayeur = PayingNetwork::where('id_network', $request->network_destinataire)->where('id_configWallet', $config->id)->firstOrFail();
$transaction->part_reseau_payeur = $frais * $reseauPayeur->taux_partage / 100;
$transaction->part_reseau_emetteur = $frais - $transaction->part_reseau_payeur;
$transaction->part_reseau_payeur_final_country = $this->toMoneyAmount($transaction->part_reseau_payeur, $init_country, $request->final_country);
if (isset($reseauPayeur))
$reseauPayeur->balance_com += $transaction->part_reseau_payeur_final_country;
//Emettre une trame securise pour crediter le wallet utilisateur
// $walletUser->balance += $transaction->montant_net_final_country;
// $transaction->id_destinataire = r
$commisionAgent = floatval($transaction->part_reseau_emetteur * $config->taux_com_ag_envoi_cash / 100);
$commisionSuper = floatval($transaction->part_reseau_emetteur * $config->taux_com_sup_envoi_cash / 100);
$commisionHyper = floatval($transaction->part_reseau_emetteur * $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 = $this->getCurrentTime($init_country);
$walletAgent->save();
$walletSuperviseur->save();
$walletHyperviseur->save();
if (isset($reseauPayeur))
$reseauPayeur->save();
$transaction->id_wallet_ag = $walletAgent->id;
$transaction->id_wallet_sup = $walletSuperviseur->id;
$transaction->id_wallet_hyp = $walletHyperviseur->id;
$transaction->id_transaction = $this->getTransactionID();
$transaction->save();
$message = trans('messages.successful_agent_deposit_other_wallet',
['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country), 'net_init' => $this->toMoney($montantDepot, $init_country),
'net_final' => $this->toMoneyWithCurrency($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), 'receiver_code' => $request->id_destinataire, 'network' => $this->getNetworkName($transaction->network_destinataire),
'sender_name' => $request->prenom_emetteur . ' ' . $request->nom_emetteur, 'receiver_name' => $request->prenom_destinataire . ' ' . $request->nom_destinataire,]);
$this->sendMail($request->email_emetteur, trans('messages.successful_transaction'), $message);
return $this->successResponse($message . trans('messages.sent_by_mail'));
} else {
return $this->errorResponse(trans('messages.incorrect_user_password'));
}
break;
case 16: // Agent - Envoi de cash vers une carte visa
$this->validate($request, $transaction->card_rules());
$agent = AgentPlus::findOrFail($network_agent->agent_id);
if ($this->checkPassword($request->password, $agent->encrypted_password, $agent->salt)) {
if ($request->montant > $walletAgent->balance_princ)
return $this->errorResponse(trans('errors.insufficient_balance'));
$expiration_date = \DateTime::createFromFormat('m/y', $request->expiration_date);
if (!$expiration_date)
$expiration_date = new \DateTime();
$transaction->expiration_date = $expiration_date;
$transaction->final_country = $init_country;
$frais = $request->montant * $config->taux_com_wallet_ag_envoi_cash_carte / 100;
$montantDepot = $transaction->montant - $frais;
$transaction->montant_net = $montantDepot;
// $body['amount'] = $this->toUSDAmount($montantDepot, $init_country);;
$body['card_number'] = $request->numero_carte;
$body['cvv'] = $request->cvv;
// $body['expiry_date'] = $expiration_date->format('Y-m');
$body['expiry_date'] = $expiration_date->format('m/y');
$body['amount'] = $montantDepot;
$body['cardholder_name'] = $request->lastname ? $request->lastname . ' ' . $request->firstname : "John Smith";
$body['currency'] = $this->getCurrency($init_country);
$body['ref'] = date("Y-m-d H:i:s.u");
$response = $client->post($this->PAYOUT_URL, ['json' => $body, 'http_errors' => false]);
$code = $response->getStatusCode();
if ($code == 200) {
$response = json_decode($response->getBody()->getContents(), true)["response"];
$transaction->pspReference = $response["pspReference"];
$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 = $this->getCurrentTime($init_country);
$walletAgent->save();
$walletSuperviseur->save();
$walletHyperviseur->save();
$transaction->id_transaction = $this->getTransactionID();
$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 17: // Agent - Envoi de cash vers cash
$this->validate($request, $transaction->cash_cash_rules());
$agent = AgentPlus::findOrFail($network_agent->agent_id);
if ($this->checkPassword($request->password, $agent->encrypted_password, $agent->salt)) {
if ($request->montant > $walletAgent->balance_princ)
return $this->errorResponse(trans('errors.insufficient_balance'));
//Verification des limites reglementaires
$rep = $this->checkReguationsLimits($request->id_document_emetteur, $init_country, $request->final_country, $transaction->montant, true);
if ($rep instanceof JsonResponse)
return $rep;
$frais = ($init_country != $request->final_country) ? $this->calculateFees($plr_agent_cash_cash, $request->montant) : $this->calculateFees($plr_agent_cash_cash_national, $request->montant);
$taxe = ($init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais);
$montantRetrait = $request->montant - $frais - $taxe;
$transaction->montant_net = $montantRetrait;
$transaction->montant_net_final_country = $this->toMoneyAmount($transaction->montant_net, $init_country, $request->final_country);
$configPayeur = ConfigWallet::where('id_network', $request->network_destinataire)->firstOrFail();
$reseauPayeur = PayingNetwork::where('id_network', $request->network_destinataire)->where('id_configWallet', $config->id)->first();
if (isset($reseauPayeur)) {
$transaction->part_reseau_payeur = $frais * $reseauPayeur->taux_partage / 100;
$transaction->part_reseau_payeur_final_country = $this->toMoneyAmount($transaction->part_reseau_payeur, $init_country, $request->final_country);
$transaction->part_reseau_emetteur = $frais - $transaction->part_reseau_payeur;
} else {
$transaction->part_reseau_payeur = 0;
$transaction->part_reseau_payeur_final_country = 0;
$transaction->part_reseau_emetteur = $frais;
}
$commisionAgent = floatval($transaction->part_reseau_emetteur * $config->taux_com_ag_envoi_cash / 100);
$commisionSuper = floatval($transaction->part_reseau_emetteur * $config->taux_com_sup_envoi_cash / 100);
$commisionHyper = floatval($transaction->part_reseau_emetteur * $config->taux_com_hyp_envoi_cash / 100);
$transaction->id_transaction = $this->getTransactionID();
if ($configPayeur->type == 'ilink') {
//Mise a jour des comissions et compensation
if (isset($reseauPayeur)) {
$reseauPayeur->balance_com += $transaction->part_reseau_payeur_final_country;
$reseauPayeur->balance_compensation += $transaction->montant_net_final_country;
}
//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
$transaction->id_wallet_hyp_payeur = $walletHyperviseur->id;
} else {
$wallet_agent_hypPayeur = WalletAgent::where('agent_id', $hyperviseurPayeur->id)->firstOrFail();
$walletHyperviseurPayeur = Wallet::findOrFail($wallet_agent_hypPayeur->wallet_id);
$walletHyperviseurPayeur->balance_com += $this->toMoneyAmount($transaction->part_reseau_payeur, $init_country, $request->final_country);
$transaction->id_wallet_hyp_payeur = $walletHyperviseurPayeur->id;
$walletHyperviseurPayeur->save();
}
} else {
//Emettre requete SSL vers wallet extene correspondant pour recharger le compte du destinataire
// La mise à jour des comissions de compensation se fera lors du traitement de la transaction
$transaction->status_reseau_payeur = 'EN_COURS';
$result = $this->sendFrame($this->PAYING_NETWORK_SIMULATOR_SEND_FRAME_URL, $transaction);
if ($result->getStatusCode() != 200)
return $this->errorResponse(trans('errors.unexpected_error'));
}
$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->commission_hyp_final_country = $this->toMoneyAmount($transaction->commission_hyp, $init_country, $request->final_country);
$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 = $this->getCurrentTime($init_country);
$transaction->status_retrait = 0;
if (isset($reseauPayeur))
$reseauPayeur->save();
$walletAgent->save();
$walletSuperviseur->save();
$walletHyperviseur->save();
$transaction->save();
$message = trans('messages.successful_agent_send_cash',
['sender_name' => $request->prenom_emetteur . ' ' . $request->nom_emetteur, 'receiver_name' => $request->prenom_destinataire . ' ' . $request->nom_destinataire,
'id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country), 'net_init' => $this->toMoney($montantRetrait, $init_country),
'net_final' => $this->toMoneyWithCurrency($montantRetrait, $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), 'code' => wordwrap($code_retrait, 4, ' ', true),
'network' => $this->getNetworkName($transaction->network_destinataire)]);
$this->sendMail($request->email_emetteur, trans('messages.successful_transaction'), $message);
return $this->successResponse($message . trans('messages.sent_by_mail'));
} else {
return $this->errorResponse(trans('messages.incorrect_user_password'));
}
break;
/**
* @OA\Schema(
* schema="agent_send_from_cash_to_bank",
* title="Agent - Envoi de cash vers banque",
* @OA\Property(property="type",
* type="integer",
* enum = {18},
* default = 18,
* description="Type de la transaction"
* ),
* @OA\Property(property="id_wallet_user",
* type="integer",
* example=9,
* description="ID du wallet de l'agent enregistré dans la base de données"
* ),
* @OA\Property(property="id_wallet_network",
* type="integer",
* example=101,
* description="ID du reseau enregistré dans la base de données auquel appartient le wallet"
* ),
* @OA\Property(property="iban",
* type="string",
* description="Identifiant bancaire"
* ),
* @OA\Property(property="id_bank",
* type="integer",
* example=4,
* description="ID de la banque enregistré dans la base de données"
* ),
* @OA\Property(property="nom_emetteur",
* type="string",
* description="Noms de l'emetteur"
* ),
* @OA\Property(property="prenom_emetteur",
* type="string",
* description="Prenoms de l'emetteur"
* ),
* @OA\Property(property="email_emetteur",
* type="string",
* description="Email de l'emetteur"
* ),
* @OA\Property(property="type_document_emetteur",
* type="string",
* description="Type de document que l'emetteur a fourni pour son identification"
* ),
* @OA\Property(property="id_document_emetteur",
* type="string",
* description="ID de l'emetteur sur le document qu'il a fourni pour son identification"
* ),
* @OA\Property(property="nom_destinataire",
* type="string",
* description="Noms du destinataire"
* ),
* @OA\Property(property="prenom_destinataire",
* type="string",
* description="Prenoms du destinataire"
* ),
* @OA\Property(property="montant",
* type="number",
* example = 10000,
* description="Montant de la transaction"
* ),
* @OA\Property(property="password",
* type="string",
* description="Mot de passe"
* )
* )
*/
/**
* @OA\Schema(
* schema="agent_send_from_cash_to_bank_frame",
* title="Agent - Envoi de cash vers banque - Trame envoyé",
* @OA\Property(property="type",
* type="integer",
* default = 18,
* description="Type de la transaction"
* ),
* @OA\Property(property="id_wallet_user",
* type="integer",
* example=9,
* description="ID du wallet de l'agent enregistré dans la base de données"
* ),
* @OA\Property(property="id_wallet_network",
* type="integer",
* example=101,
* description="ID du reseau enregistré dans la base de données auquel appartient le wallet"
* ),
* @OA\Property(property="iban",
* type="string",
* description="Identifiant bancaire"
* ),
* @OA\Property(property="id_bank",
* type="integer",
* example=4,
* description="ID de la banque enregistré dans la base de données"
* ),
* @OA\Property(property="nom_emetteur",
* type="string",
* description="Noms de l'emetteur"
* ),
* @OA\Property(property="prenom_emetteur",
* type="string",
* description="Prenoms de l'emetteur"
* ),
* @OA\Property(property="email_emetteur",
* type="string",
* description="Email de l'emetteur"
* ),
* @OA\Property(property="type_document_emetteur",
* type="string",
* description="Type de document que l'emetteur a fourni pour son identification"
* ),
* @OA\Property(property="id_document_emetteur",
* type="string",
* description="ID de l'emetteur sur le document qu'il a fourni pour son identification"
* ),
* @OA\Property(property="nom_destinataire",
* type="string",
* description="Noms du destinataire"
* ),
* @OA\Property(property="prenom_destinataire",
* type="string",
* description="Prenoms du destinataire"
* ),
* @OA\Property(property="montant",
* type="number",
* example = 10000,
* description="Montant de la transaction"
* ),
* @OA\Property(property="frais",
* type="number",
* example = 100,
* description="Montant des frais de la transaction"
* ),
* @OA\Property(property="taxe",
* type="number",
* example = 50,
* description="Montant des taxes de la transaction"
* ),
* @OA\Property(property="commission_hyp",
* type="number",
* example = 25,
* description="Montant de la commission de l'hyperviseur du réseau sur la transaction"
* ),
* @OA\Property(property="commission_sup",
* type="number",
* example = 25,
* description="Montant de la commission du superviseur de l'agent du réseau sur la transaction"
* ),
* @OA\Property(property="commission_ag",
* type="number",
* example = 25,
* description="Montant de la commission de l'agent géolocalisé sur la transaction"
* ),
* )
*/
case 18: // Agent - Envoi de cash vers banque
$this->validate($request, [
'iban' => 'required',
'id_wallet_network' => 'required|integer|min:0|not_in:0',
'id_bank' => 'required|integer|min:0|not_in:0',
'nom_emetteur' => 'required',
'prenom_emetteur' => 'required',
'type_document_emetteur' => 'required',
'id_document_emetteur' => 'required',
'email_emetteur' => 'required',
'nom_destinataire' => 'required',
'prenom_destinataire' => 'required',
]);
$agent = AgentPlus::findOrFail($network_agent->agent_id);
if (!$this->checkPassword($request->password, $agent->encrypted_password, $agent->salt))
return $this->errorResponse(trans('messages.incorrect_user_password'));
if ($request->montant > $walletAgent->balance_princ)
return $this->errorResponse(trans('errors.insufficient_balance'));
//Verifier si la banque est associée au reseau
$network_bank = NetworksOperator::where('id_network', $request->id_wallet_network)->where('id_operator_country', $request->id_bank)->first();
if (!$network_bank)
return $this->errorResponse(trans('errors.bank_not_associated_with_network'));
if ($network_bank->operators_country->operator->type != 'bank')
return $this->errorResponse(trans('errors.not_banking_operator'));
//Verifier le code IBAN
$country_code = $network_bank->network->country->code_country;
$bank_code = $network_bank->operators_country->code;
switch ($this->checkIBAN($request->iban, $country_code, $bank_code)) {
case 0:
return $this->errorResponse(trans('errors.invalid_iban'));
case 1:
return $this->errorResponse(trans('errors.country_not_match_iban'));
case 2:
return $this->errorResponse(trans('errors.bank_not_match_iban'));
}
$transaction->frais = $frais = 0;
$transaction->taxe = $taxe = 0;
// $walletUser->balance -= $transaction->montant;
//Emettre une trame SSL pour recharger le compte bancaire du montant de la transaction
$transaction->commission_banque = 0;
$transaction->commission_hyp = 0;
$transaction->commission_sup = 0;
$transaction->commission_ag = 0;
$transaction->id_wallet_hyp = $walletHyperviseur->id;
$transaction->id_wallet_ag = $walletAgent->id;
$transaction->id_wallet_sup = $walletSuperviseur->id;
$transaction->frais = $frais;
$transaction->date = $this->getCurrentTime($init_country);
$transaction->bank = $network_bank->operators_country->operator->nom;
$transaction->country = $network_bank->network->country->name;
$transaction->id_bank = $request->id_bank;
$transaction->iban = $request->iban;
// $walletUser->save();
$transaction->id_transaction = $this->getTransactionID();
// $transaction->save();
Log::info('-------------------------- Agent - Envoi de cash vers banque ------------------------------------');
Log::info($transaction->toArray());
Log::info('------------------------------------------------------------------------------------------------');
$message = trans('messages.successful_agent_send_from_cash_to_bank',
['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country), 'receiver_name' => $request->prenom_destinataire . ' ' . $request->nom_destinataire,
'net' => $this->toMoney($transaction->montant, $init_country), 'iban' => $request->iban, 'fees' => $this->toMoney($frais, $init_country), 'sender_name' => $request->prenom_emetteur . ' ' . $request->nom_emetteur,
'sender_code' => $codeGenerer->code_membre, 'bank' => $transaction->bank, 'country' => $transaction->country]);
$this->sendMail($request->email_emetteur, trans('messages.successful_transaction'), $message);
return $this->successResponse($message . trans('messages.sent_by_mail'));
/**
* @OA\Schema(
* schema="user_payement_of_operator",
* title = "User - Payer une facture chez un operateur",
* @OA\Property(property="type",
* type="integer",
* enum = {19},
* default = 19,
* description="Type de la transaction"
* ),
* @OA\Property(property="id_wallet_user",
* type="integer",
* example=9,
* description="ID du wallet de l'utilisateur enregistré dans la base de données"
* ),
* @OA\Property(property="id_wallet_network",
* type="integer",
* example=101,
* description="ID du reseau enregistré dans la base de données auquel appartient le wallet"
* ),
* @OA\Property(property="no_facture",
* type="string",
* description="Numero de la facture"
* ),
* @OA\Property(property="type_operator",
* type="string",
* enum={"electricity", "phone" , "tv" ,"school" , "water"},
* default="electricity",
* description="Type d'operateur"
* ),
* @OA\Property(property="id_operator",
* type="integer",
* example = 16,
* description="ID de l'operateur"
* ),
* @OA\Property(property="montant",
* type="number",
* example = 10000,
* description="Montant de la transaction"
* ),
* @OA\Property(property="password",
* type="string",
* description="Mot de passe"
* )
* )
*/
/**
* @OA\Schema(
* schema="user_payement_of_operator_frame",
* title = "User - Payer une facture chez un operateur - Trame envoyé",
*
* @OA\Property(property="id_transaction",
* type="string",
* example = "PYHL8CCZYPCM",
* description="ID de la transaction généré dans la base de données"
* ),
* @OA\Property(property="type",
* type="integer",
* default = 19,
* description="Type de la transaction"
* ),
* @OA\Property(property="id_wallet_user",
* type="integer",
* example=9,
* description="ID du wallet de l'utilisateur enregistré dans la base de données"
* ),
* @OA\Property(property="network_emetteur",
* type="integer",
* example=101,
* description="ID du reseau enregistré dans la base de données auquel appartient le wallet"
* ),
* @OA\Property(property="country",
* type="string",
* example ="Cameroon",
* description="Pays où la transaction été éfféctuée"
* ),
* @OA\Property(property="no_facture",
* type="string",
* example ="ENEO1425533",
* description="Numero de la facture"
* ),
* @OA\Property(property="operator",
* type="string",
* default="ENEO",
* description="Nom de l'operateur"
* ),
* @OA\Property(property="type_operator",
* type="string",
* default="Opérateur d'électricité",
* description="Type d'operateur"
* ),
* @OA\Property(property="id_operator",
* type="integer",
* example = 16,
* description="ID de l'operateur"
* ),
* @OA\Property(property="montant",
* type="number",
* example = 10000,
* description="Montant de la transaction"
* ),
* @OA\Property(property="frais",
* type="number",
* example = 100,
* description="Montant des frais de la transaction"
* ),
* @OA\Property(property="taxe",
* type="number",
* example = 50,
* description="Montant des taxes de la transaction"
* ),
* @OA\Property(property="commission_hyp",
* type="number",
* example = 25,
* description="Montant de la commission de l'hyperviseur du réseau sur la transaction"
* ),
* @OA\Property(property="date",
* type="string",
* example = "2020-11-30T08:57:57.000000Z",
* description="Date à laquelle la transaction a été éffectuée"
* )
* )
*/
case 19: // User - Payer un operateur
$this->validate($request, [
'id_operator' => 'required|integer|min:0|not_in:0',
'id_wallet_network' => 'required|integer|min:0|not_in:0',
'type_operator' => 'required|in:water,electricity,tv,school',
'no_facture' => 'required',
]);
$user = $walletUser->user;
if (!$this->checkPassword($request->password, $user->encrypted_password, $user->salt))
return $this->errorResponse(trans('messages.incorrect_user_password'));
if ($request->montant > $walletUser->balance)
return $this->errorResponse(trans('errors.insufficient_balance'));
//Verifier si l'operateur est associée au reseau
$network_bank = NetworksOperator::where('id_network', $request->id_wallet_network)->where('id_operator_country', $request->id_operator)->first();
if (!$network_bank)
return $this->errorResponse(trans('errors.operator_not_associated_with_network'));
if ($network_bank->operators_country->operator->type != $request->type_operator) {
$type_operator = TypeOperator::where('code', $request->type_operator)->firstOrFail();
$type = app()->isLocale('en') ? $type_operator->description_en : $type_operator->description_fr;
return $this->errorResponse(trans('errors.not_matching_operator', ['type_operator' => $type]));
}
$transaction->frais = $frais = 0;
$transaction->taxe = $taxe = 0;
// $walletUser->balance -= $transaction->montant;
//Emettre une trame SSL pour recharger l'api de l'operateur du montant de la transaction
$transaction->commission_hyp = 0;
$transaction->id_wallet_hyp = $walletHyperviseur->id;
$transaction->frais = $frais;
$transaction->date = $this->getCurrentTime($init_country);
$transaction->operator = $network_bank->operators_country->operator->nom;
$type_operator = $network_bank->operators_country->operator->type_operator;
$transaction->type_operator = app()->isLocale('en') ? $type_operator->description_en : $type_operator->description_fr;
$transaction->country = $network_bank->network->country->name;
$transaction->id_operator = $request->id_operator;
$transaction->no_facture = $request->no_facture;
// $walletUser->save();
$transaction->id_transaction = $this->getTransactionID();
// $transaction->save();
Log::info('-------------------------- User - Payer une facture chez un operateur ------------------------------------');
Log::info($transaction->toArray());
Log::info('------------------------------------------------------------------------------------------------');
$message = trans('messages.successful_user_payment_of_operator',
['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country),
'net' => $this->toMoney($transaction->montant, $init_country), 'no_facture' => $request->no_facture, 'fees' => $this->toMoney($frais, $init_country),
'sender_code' => $user->user_code, 'operator' => $transaction->operator, 'type_operator' => $transaction->type_operator]);
$this->sendMail($user->email, trans('messages.successful_transaction'), $message);
return $this->successResponse($message . trans('messages.sent_by_mail'));
/**
* @OA\Schema(
* schema="user_remove_from_bank_to_wallet",
* title="User - Retrait de la banque vers le wallet",
* @OA\Property(property="type",
* type="integer",
* enum = {20},
* default = 20,
* description="Type de la transaction"
* ),
* @OA\Property(property="id_wallet_user",
* type="integer",
* example=9,
* description="ID du wallet de l'utilisateur enregistré dans la base de données"
* ),
* @OA\Property(property="montant",
* type="number",
* example = 10000,
* description="Montant de la transaction"
* ),
* @OA\Property(property="password",
* type="string",
* description="Mot de passe"
* )
* )
*/
/**
* @OA\Schema(
* schema="user_remove_from_bank_to_wallet_frame",
* title="User - Retrait de la banque vers le wallet - Trame envoyé ",
* @OA\Property(property="type",
* type="integer",
* default = 20,
* description="Type de la transaction"
* ),
* @OA\Property(property="id_wallet_user",
* type="integer",
* example=9,
* description="ID du wallet de l'utilisateur enregistré dans la base de données"
* ),
* @OA\Property(property="network_emetteur",
* type="integer",
* example=101,
* description="ID du reseau enregistré dans la base de données auquel appartient le wallet"
* ),
* @OA\Property(property="iban",
* type="string",
* example = "CM15UBAA412341234123412341233",
* description="ID bancaire de l'utilisateur"
* ),
* @OA\Property(property="id_bank",
* type="integer",
* example = 16,
* description="ID de la banque dans la base de données"
* ),
* @OA\Property(property="bank",
* type="string",
* default="UBA",
* description="Nom de la banque"
* ),
* @OA\Property(property="country",
* type="string",
* default="Cameroon",
* description="Pays où la transaction été éfféctuée"
* ),
* @OA\Property(property="montant",
* type="number",
* example = 10000,
* description="Montant de la transaction"
* ),
* @OA\Property(property="frais",
* type="number",
* example = 100,
* description="Montant des frais de la transaction"
* ),
* @OA\Property(property="taxe",
* type="number",
* example = 50,
* description="Montant des taxes de la transaction"
* ),
* @OA\Property(property="commission_hyp",
* type="number",
* example = 25,
* description="Montant de la commission de l'hyperviseur du réseau sur la transaction"
* ),
* @OA\Property(property="commission_banque",
* type="number",
* example = 25,
* description="Montant de la commission de la banque sur le réseau sur la transaction"
* ),
* @OA\Property(property="date",
* type="string",
* example = "2020-11-30T08:57:57.000000Z",
* description="Date à laquelle la transaction a été éffectuée"
* )
* )
*/
case 20: //User - Retrait de la banque vers le wallet
// $this->validate($request, [
// 'code_retrait' => 'required',
// ]);
$user = $walletUser->user;
if (!$this->checkPassword($request->password, $user->encrypted_password, $user->salt))
return $this->errorResponse(trans('messages.incorrect_user_password'));
$rep = $this->checkUserIdentification($user->id);
if ($rep instanceof JsonResponse)
return $rep;
if (!(isset($user->iban) && isset($user->id_bank_country)))
return $this->errorResponse(trans('errors.wallet_not_linked_to_bank_account'));
//Reverifier si l'operateur est toujours associé au reseau
$network_bank = NetworksOperator::where('id_network', $transaction->network_emetteur)->where('id_operator_country', $user->id_bank_country)->first();
if (!$network_bank)
return $this->errorResponse(trans('errors.operator_not_associated_with_network') . '. ' . trans('errors.update_banking_information'));
if ($network_bank->operators_country->operator->type != 'bank')
return $this->errorResponse(trans('errors.not_banking_operator') . '. ' . trans('errors.update_banking_information'));
//Reverifier le code IBAN correspond toujours
$country_code = $network_bank->network->country->code_country;
$bank_code = $network_bank->operators_country->code;
switch ($this->checkIBAN($user->iban, $country_code, $bank_code)) {
case 0:
return $this->errorResponse(trans('errors.invalid_iban') . '. ' . trans('errors.update_banking_information'));
case 1:
return $this->errorResponse(trans('errors.country_not_match_iban') . '. ' . trans('errors.update_banking_information'));
case 2:
return $this->errorResponse(trans('errors.bank_not_match_iban') . '. ' . trans('errors.update_banking_information'));
}
// Envoyer la trame vers banque pour debiter le compte client et recharger le compte bancaire de iLink
// ----->
$transaction->frais = $frais = 0;
$transaction->taxe = $taxe = 0;
// $walletUser->balance += $transaction->montant;
$transaction->commission_banque = 0;
$transaction->commission_hyp = 0;
$transaction->id_wallet_hyp = $walletHyperviseur->id;
$transaction->frais = $frais;
$transaction->date = $this->getCurrentTime($init_country);
$transaction->bank = $user->bank->operators_country->operator->nom;
$transaction->country = $user->bank->network->country->name;
$transaction->id_bank = $user->id_bank_country;
$transaction->iban = $user->iban;
// $walletUser->save();
$transaction->id_transaction = $this->getTransactionID();
// $transaction->save();
Log::info('-------------------------- User - Retrait de la banque vers le wallet ------------------------------------');
Log::info($transaction->toArray());
Log::info('------------------------------------------------------------------------------------------------');
$message = trans('messages.successful_user_remove_from_bank_to_wallet',
['id_transaction' => $transaction->id_transaction, 'amount' => $this->toMoney($transaction->montant, $init_country),
'net' => $this->toMoney($transaction->montant, $init_country), 'iban' => $user->iban, 'fees' => $this->toMoney($frais, $init_country),
'sender_code' => $user->user_code, 'bank' => $transaction->bank, 'country' => $transaction->country]);
$this->sendMail($user->email, trans('messages.successful_transaction'), $message);
return $this->successResponse($message . trans('messages.sent_by_mail'));
}
}
public function lastUserTransactions($id_user)
{
$user = User::findOrFail($id_user);
$wallet_user = WalletsUser::where('idUser', $user->id)->firstOrFail();
$transactions = DB::select('SELECT id_wallet_user , operation_fr , operation_en, id_transaction ,network_destinataire, init_country , final_country, date , id , montant , frais , taxe , pays_init , pays_final,
destinataire_phone , destinataire_name , nom_destinataire, prenom_destinataire, montant_net ,montant_net_final_country FROM infos_ilink_transaction WHERE id_wallet_user = :id_wallet AND type <> 12 AND type <> 14
ORDER BY date DESC LIMIT 10;', ['id_wallet' => $wallet_user->id]);
foreach ($transactions as $data) {
$data->operation = app()->isLocale('en') ? $data->operation_en : $data->operation_fr;
$date = $data->date;
unset($data->date);
$user_destinataire = isset($data->id_destinataire) ? User::where('user_code', $data->id_destinataire)->first() : null;
// $emetteur = $wallet_user ? $wallet_user->user->lastname.' '.$wallet_user->user->firstname : $data->prenom_emetteur . ' ' . $data->nom_emetteur;
$emetteur = 'Moi';
if ($data->destinataire_phone) {
$destinataire = $data->destinataire_name;
} else {
$destinataire = $data->prenom_destinataire ? $data->prenom_destinataire . ' ' . $data->nom_destinataire : $emetteur;
}
// $destinataire = in_array($data->type,[12,16]) ? $emetteur : ( $user_destinataire ? $user_destinataire->lastname.' '.$user_destinataire->firstname :
// $data->prenom_destinataire . ' ' . $data->nom_destinataire);
$data->emetteur = $emetteur;
$data->destinataire = $destinataire;
$data->frais = $this->toMoney($data->frais + $data->taxe, $data->init_country);
$data->montant_net_init = $this->toMoney($data->montant_net, $data->init_country);
$data->montant_net_final = $data->montant_net_final_country ? $this->toMoney($data->montant_net_final_country, $data->final_country) : $data->montant_net_init;
$data->montant = $this->toMoney($data->montant, $data->init_country);
$data->init_country = $data->pays_init;
$data->final_country = $data->pays_final;
$data->reseau_payeur = isset($data->network_destinataire) ? $this->getNetworkName($data->network_destinataire) . ' ' . $data->final_country : null;
$data->date = $date;
unset($data->type, $data->destinataire_name, $data->id_wallet_user, $data->network_destinataire, $data->nom_destinataire, $data->prenom_destinataire, $data->taxe, $data->numero_carte,
$data->montant_net_final_country, $data->montant_net, $data->pays_init, $data->pays_final, $data->id_destinataire, $data->destinataire_phone, $data->operation_fr, $data->operation_en);
}
return $this->successResponse($transactions);
}
public function lastAgentTransactions($id_wallet_agent)
{
$transactions = DB::select('SELECT wit.id_transaction, tit.nom as operation_fr , tit.name as operation_en, wit.montant ,wit.nom_emetteur, wit.prenom_emetteur, wit.id_wallet_user,wit.frais,wit.taxe,wit.id_destinataire,
wit.nom_destinataire, wit.prenom_destinataire, wit.type , wit.id_wallet_user, wit.init_country, wit.final_country , wit.network_destinataire , wit.montant_net_final_country ,
wit.date , wit.id , wit.numero_carte, wit.montant_net FROM wallet_ilink_transaction wit
INNER JOIN type_ilink_transaction tit ON wit.type = tit.id WHERE wit.id_wallet_ag = :id_wallet
ORDER BY wit.date DESC LIMIT 10;', ['id_wallet' => $id_wallet_agent]);
foreach ($transactions as $data) {
$data->operation = app()->isLocale('en') ? $data->operation_en : $data->operation_fr;
$date = $data->date;
unset($data->date);
$wallet_user = isset($data->id_wallet_user) ? WalletsUser::findOrFail($data->id_wallet_user) : null;
$user_destinataire = isset($data->id_destinataire) ? User::where('user_code', $data->id_destinataire)->first() : null;
$emetteur = $wallet_user ? $wallet_user->user->lastname . ' ' . $wallet_user->user->firstname : $data->prenom_emetteur . ' ' . $data->nom_emetteur;
if (!$wallet_user && !$data->nom_emetteur)
$emetteur = $data->numero_carte;
$destinataire = in_array($data->type, [12, 16]) ? $emetteur : ($user_destinataire ? $user_destinataire->lastname . ' ' . $user_destinataire->firstname :
$data->prenom_destinataire . ' ' . $data->nom_destinataire);
$data->emetteur = $emetteur;
$data->destinataire = $destinataire;
$data->frais = $this->toMoney($data->frais + $data->taxe, $data->init_country);
$data->montant_net_init = $this->toMoney($data->montant_net, $data->init_country);
$data->montant_net_final = $data->montant_net_final_country ? $this->toMoney($data->montant_net_final_country, $data->final_country) : $data->montant_net_init;
$data->montant = $this->toMoney($data->montant, $data->init_country);
$data->init_country = $this->getCountryName($data->init_country);
$data->final_country = $data->montant_net_final_country ? $this->getCountryName($data->final_country) : '';
$data->reseau_payeur = isset($data->network_destinataire) ? $this->getNetworkName($data->network_destinataire) . ' ' . $data->final_country : null;
$data->date = $date;
unset($data->type, $data->id_wallet_user, $data->network_destinataire, $data->nom_destinataire, $data->prenom_destinataire, $data->taxe, $data->numero_carte,
$data->montant_net_final_country, $data->montant_net, $data->nom_emetteur, $data->prenom_emetteur, $data->id_destinataire, $data->operation_fr, $data->operation_en);
}
return $this->successResponse($transactions);
}
public function calculateCommission(Request $request)
{
$rules = [
'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',
];
$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();
$init_country = $network_agent->network->country->id;
} 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',
'network_destinataire' => 'required|integer|min:0|not_in:0',
]);
$configNetworkDestinataire = ConfigWallet::where('id_network', $request->network_destinataire)->firstOrFail();
$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);
//Verifier si c'est pas un reseau ilink
if ($configNetworkDestinataire->type != 'ilink') {
$data['destinataire'] = $request->id_destinataire;
} else {
$destinataire = User::where('user_code', $request->id_destinataire)->first();
$data['destinataire'] = $destinataire ? $destinataire->lastname . ' ' . $destinataire->firstname : $request->id_destinataire;
}
$data['frais'] = round($frais + $taxe, 2);
$data['montant_net_init'] = round($request->montant - $data['frais'], 2);
$data['montant_net_final'] = $this->toMoneyWithCurrency($data['montant_net_init'], $init_country, $request->final_country);
break;
case 2: //User - Envoi de wallet à carte
$frais = $request->montant * $config->taux_com_user_wallet_carte / 100;
$data['frais'] = round($frais, 2);
$data['montant_net'] = round($request->montant - $data['frais'], 2);
break;
case 3: // User - Envoi wallet à cash
$this->validate($request, [
'final_country' => 'required|integer|min:0|not_in:0',
]);
$frais = ($init_country != $request->final_country) ? $this->calculateFees($plr_user_wallet_cash, $request->montant) : $this->calculateFees($plr_user_wallet_cash_national, $request->montant);
$taxe = ($init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais);
$data['frais'] = round($frais + $taxe, 2);
$data['montant_net_init'] = round($request->montant - $data['frais'], 2);
$data['montant_net_final'] = $this->toMoneyWithCurrency($data['montant_net_init'], $init_country, $request->final_country);
break;
case 9: // User - Retrait de wallet en cash
$frais = $this->calculateFees($plr_user_wallet_cash_national, $request->montant);
$taxe = $this->calculateTax($taxesNationales, $frais);
$data['frais'] = round($frais + $taxe, 2);
$data['montant_net'] = round($request->montant - $data['frais'], 2);
break;
case 10: //User - Retrait de carte vers wallet
$frais = $request->montant * $config->taux_com_user_carte_wallet / 100;;
$data['frais'] = round($frais, 2);
$data['montant_net'] = round($request->montant + $data['frais'], 2);
break;
case 11: // User - Retrait de carte vers cash
$frais = $request->montant * $config->taux_com_user_carte_cash / 100;
$data['frais'] = round($frais, 2);
$data['montant_net'] = round($request->montant + $data['frais'], 2);
break;
case 13: // Agent - Retrait de la carte vers cash
$frais = $request->montant * $config->taux_com_wallet_ag_carte_cash / 100;
$data['frais'] = round($frais, 2);
$data['montant_net'] = round($request->montant + $data['frais'], 2);
break;
case 14: // Agent - Envoi de cash vers wallet iLink
$this->validate($request, [
'user_code' => 'required',
]);
$user = User::where('user_code', $request->user_code)->first();
if (!$user)
return $this->errorResponse(trans('errors.wallet_not_defined'));
$final_country = $user->network->country->id;
$frais = ($init_country != $final_country) ? $this->calculateFees($plr_agent_depot_wallet_ilink, $request->montant) : $this->calculateFees($plr_agent_depot_wallet_ilink_national, $request->montant);
$taxe = ($init_country != $final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais);
$data['frais'] = round($frais + $taxe, 2);
$data['montant_net_init'] = round($request->montant - $data['frais'], 2);
$data['montant_net_final'] = $this->toMoneyWithCurrency($data['montant_net_init'], $init_country, $final_country);
break;
case 15: // Agent - Envoi de cash vers autre wallet
$this->validate($request, [
'final_country' => 'required|integer|min:0|not_in:0',
]);
$frais = ($init_country != $request->final_country) ? $this->calculateFees($plr_agent_depot_autre_wallet, $request->montant) : $this->calculateFees($plr_agent_depot_autre_wallet_national, $request->montant);
$taxe = ($init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais);
$data['frais'] = round($frais + $taxe, 2);
$data['montant_net_init'] = round($request->montant - $data['frais'], 2);
$data['montant_net_final'] = $this->toMoneyWithCurrency($data['montant_net_init'], $init_country, $request->final_country);
break;
case 16: // Agent - Envoi de cash vers une carte visa
$frais = $request->montant * $config->taux_com_wallet_ag_envoi_cash_carte / 100;
$data['frais'] = round($frais, 2);
$data['montant_net'] = round($request->montant - $data['frais'], 2);
break;
case 17: // Agent - Envoi de cash vers cash
$this->validate($request, [
'final_country' => 'required|integer|min:0|not_in:0',
]);
$frais = ($init_country != $request->final_country) ? $this->calculateFees($plr_agent_cash_cash, $request->montant) : $this->calculateFees($plr_agent_cash_cash_national, $request->montant);
$taxe = ($init_country != $request->final_country) ? $this->calculateTax($taxesInternationales, $frais) : $this->calculateTax($taxesNationales, $frais);
$data['frais'] = round($frais + $taxe, 2);
$data['montant_net_init'] = round($request->montant - $data['frais'], 2);
$data['montant_net_final'] = $this->toMoneyWithCurrency($data['montant_net_init'], $init_country, $request->final_country);
break;
}
$net = isset($data['montant_net']) ? $data['montant_net'] : $data['montant_net_init'];
if (isset($net))
if ($net < 0)
return $this->errorResponse(trans('errors.incorrect_net_amount'));
return $this->successResponse($data);
}
public function getTransactionRetrait(Request $request)
{
$this->validate($request, [
'id_transaction' => 'required',
'id_wallet_agent' => 'required|integer|min:0|not_in:0',
'code_retrait' => 'required',
]);
$transaction = WalletIlinkTransaction::select('nom_destinataire', 'prenom_destinataire', 'type_document_destinataire', 'id_document_destinataire', 'type', 'encrypted_code_retrait', 'code_retrait_salt',
'id_wallet_user', 'init_country', 'final_country', 'network_destinataire', 'id_transaction', 'montant_net_final_country', 'montant_net')->where('id_transaction', $request->id_transaction)->first();
if (!$transaction)
return $this->errorResponse(trans('errors.transaction_not_exist'), Response::HTTP_NOT_FOUND);
if (!$this->checkPassword($request->code_retrait, $transaction->encrypted_code_retrait, $transaction->code_retrait_salt))
return $this->errorResponse(trans('errors.invalid_withdrawal_code'));
//Verifier que le reseau payeur est de type iLink
if (in_array($transaction->type, [3, 17])) {
$configPayeur = ConfigWallet::where('id_network', $transaction->network_destinataire)->firstOrFail();
if ($configPayeur->type != 'ilink')
return $this->errorResponse(trans('errors.withdrawal_network_unauthorized'));
}
if ($transaction->status_retrait != 0)
return $this->errorResponse(trans('errors.withdrawal_already_made'));
$walletAgent = Wallet::findOrFail($request->get('id_wallet_agent'));
$network_agent = NetworksAgent::findOrFail($walletAgent->id_networkAgent);
$agent_country = $network_agent->network->country->id;
if ($agent_country != $transaction->final_country)
return $this->errorResponse(trans('errors.operation_cannot_performed_in_country'));
$data = $transaction->replicate();
if (in_array($transaction->type, [9, 11])) {
$identification = $identification = Identification::where('id_user', $transaction->wallet_user->user->id)->first();
if (!$identification)
return $this->errorResponse(trans('errors.user_identification_required'));
if ($identification->status != 1)
return $this->errorResponse(trans('errors.validation_user_identification_required'));
$data->nom_destinataire = $transaction->wallet_user->user->lastname;
$data->prenom_destinataire = $transaction->wallet_user->user->firstname;
$data->type_document_destinataire = $identification->identity_document;
$data->id_document_destinataire = $identification->id_identity_document;
// $data->user_code = $transaction->wallet_user->user->user_code;
}
$data->montant = $transaction->type == 11 ? $transaction->montant_net : $transaction->montant_net_final_country;
unset($data->type, $data->init_country, $data->final_country, $data->id_wallet_user, $data->network_destinataire, $data->code_retrait_salt,
$data->encrypted_code_retrait, $data->montant_net_final_country, $data->montant_net);
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);
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;
}
}
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;
}
}
return 0;
}
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);
}
private function getTransactionID()
{
do {
$code = $this->generateTransactionCode();
$result = collect(DB::select('SELECT * FROM wallet_ilink_transaction WHERE id_transaction = :code', ['code' => $code]));
$codeCorrect = sizeof($result) < 0;
} while ($codeCorrect);
return $code;
}
// public function index(Request $request){
//
// $notices = DB::select('select notices.id,notices.title,notices.body,notices.created_at,notices.updated_at,
//users.name,departments.department_name
//FROM notices
//INNER JOIN users ON notices.user_id = users.id
//INNER JOIN departments on users.dpt_id = departments.id
//ORDER BY users.id DESC');
//
// $notices = $this->arrayPaginator($notices, $request);
//
// return view('welcome')->with('allNotices', $notices);
//
// }
public function cancel($id_transaction)
{
$transaction = WalletIlinkTransaction::where('id_transaction', $id_transaction)->firstOrFail();
$transactionInverse = $transaction->replicate();
$transactionInverse->date = new \DateTime();
$transactionInverse->montant = -$transaction->montant;
$transactionInverse->montant_net = -$transaction->montant_net;
$transactionInverse->montant_net_final_country = -$transaction->montant_net_final_country;
$transactionInverse->taxe = -$transaction->taxe;
$transactionInverse->frais = -$transaction->frais;
$transactionInverse->commission_ag = -$transaction->commission_ag;
$transactionInverse->commission_sup = -$transaction->commission_sup;
$transactionInverse->commission_hyp = -$transaction->commission_hyp;
$transactionInverse->commission_hyp_final_country = -$transaction->commission_hyp_final_country;
$transactionInverse->commission_banque = -$transaction->commission_banque;
$transactionInverse->id = null;
$transactionInverse->id_transaction = $this->getTransactionID();
// $walletAgent = $transaction->wallet;
// $walletSuperviseur = $transaction->wallet_sup;
// $walletHyperviseur = $transaction->wallet_hyp;
//
// if ($transaction->type == 'credit'){
// //Depot
// $walletAgent->balance_princ += $transaction->montant;
// }elseif ($transaction->type == 'debit'){
// //Retrait
// $walletAgent->balance_princ -= $transaction->montant;
// }
//
// $walletAgent->balance_com -= $transaction->commission_ag;
// $walletSuperviseur->balance_com -= $transaction->commission_sup;
// $walletHyperviseur->balance_com -= $transaction->commission_hyp;
$transaction->canceled = 1;
// $walletAgent->save();
// $walletSuperviseur->save();
// $walletHyperviseur->save();
$transaction->save();
$transactionInverse->save();
return $this->successResponse(trans('messages.canceled_transaction'));
}
//Verfier les limites reglementaires
public function checkReguationsLimits($identifiant, $init_country, $final_country, $montant_transaction, $is_id_document_emetteur = false)
{
$regulation = Regulation::where('id_country', $init_country)->first();
if (!$regulation)
return;
// Total montants journalier
if ($is_id_document_emetteur)
$daily_sum = WalletIlinkTransaction::where('id_document_emetteur', $identifiant)->where('final_country', $final_country)->whereDate('date', Carbon::today())->sum('montant');
else
$daily_sum = WalletIlinkTransaction::where('id_wallet_user', $identifiant)->where('final_country', $final_country)->whereDate('date', Carbon::today())->sum('montant');
$max_jour = ($init_country == $final_country) ? $regulation->montant_max_jour_national : $regulation->montant_max_jour_international;
$amount_admitted = $max_jour - $daily_sum;
if (($daily_sum + $montant_transaction) > $max_jour)
return $this->errorResponse(($init_country == $final_country) ? trans('errors.national_daily_regulations_limits_reached') : trans('errors.international_daily_regulations_limits_reached') . ' '
. ($amount_admitted > 0 ? trans('errors.regulations_limits_amount_transaction', ['amount' => $this->toMoney($amount_admitted, $init_country)]) : ''));
// Total montants hebdomadaire
if ($is_id_document_emetteur)
$weekly_sum = WalletIlinkTransaction::where('id_document_emetteur', $identifiant)->where('final_country', $final_country)->whereBetween('date', [Carbon::today()->subDay(7), Carbon::today()])->sum('montant');
else
$weekly_sum = WalletIlinkTransaction::where('id_wallet_user', $identifiant)->where('final_country', $final_country)->whereBetween('date', [Carbon::today()->subDay(7), Carbon::today()])->sum('montant');
$max_hebdo = ($init_country == $final_country) ? $regulation->montant_max_hebdo_national : $regulation->montant_max_hebdo_international;
$amount_admitted = $max_hebdo - $weekly_sum;
if (($weekly_sum + $montant_transaction) > $max_hebdo)
return $this->errorResponse(($init_country == $final_country) ? trans('errors.national_weekly_regulations_limits_reached') : trans('errors.international_weekly_regulations_limits_reached') . ' '
. ($amount_admitted > 0 ? trans('errors.regulations_limits_amount_transaction', ['amount' => $this->toMoney($amount_admitted, $init_country)]) : ''));
// Total montants mensuel
if ($is_id_document_emetteur)
$monthly_sum = WalletIlinkTransaction::where('id_document_emetteur', $identifiant)->where('final_country', $final_country)->whereBetween('date', [Carbon::today()->subDay(30), Carbon::today()])->sum('montant');
else
$monthly_sum = WalletIlinkTransaction::where('id_wallet_user', $identifiant)->where('final_country', $final_country)->whereBetween('date', [Carbon::today()->subDay(30), Carbon::today()])->sum('montant');
$max_mensuel = ($init_country == $final_country) ? $regulation->montant_max_mensuel_national : $regulation->montant_max_mensuel_international;
$amount_admitted = $max_mensuel - $monthly_sum;
if (($monthly_sum + $montant_transaction) > $max_mensuel)
return $this->errorResponse(($init_country == $final_country) ? trans('errors.national_monthly_regulations_limits_reached') : trans('errors.international_monthly_regulations_limits_reached') . ' '
. ($amount_admitted > 0 ? trans('errors.regulations_limits_amount_transaction', ['amount' => $this->toMoney($amount_admitted, $init_country)]) : ''));
}
// Recevoir le traitement d'une transaction venant d'un reseau payeur
public function receiveRequestProcessingResult(Request $request)
{
$this->validate($request, [
'id_transaction' => 'required',
'status' => 'required|in:NON_TRAITEE,TRAITEE'
]);
$transaction = WalletIlinkTransaction::where('id_transaction', $request->id_transaction)->firstOrFail();
if (!in_array($transaction->type, [1, 3, 17]))
return $this->errorResponse(trans('errors.forbidden'));
if ($transaction->status_reseau_payeur != 'EN_COURS')
return $this->errorResponse(trans('errors.request_already_processed'));
// modifier l'etat et mettre les comptes comissions et compensatios du reseau payeur
$transaction->status_reseau_payeur = $request->status;
if ($request->status == 'TRAITEE') {
//Mise a jour des comissions et compensation
$config = ConfigWallet::where('id_network', $transaction->network_emetteur)->firstOrFail();
$reseauPayeur = PayingNetwork::where('id_network', $transaction->network_destinataire)->where('id_configWallet', $config->id)->firstOrFail();
$reseauPayeur->balance_com += $transaction->part_reseau_payeur_final_country;
$reseauPayeur->balance_compensation += $transaction->montant_net_final_country;
$reseauPayeur->save();
}
$transaction->save();
return $this->successResponse(trans('messages.success_treated_demand'));
}
}