From 95bfc8f3bda6fae985884c232ea970291910ac7e Mon Sep 17 00:00:00 2001 From: DJERY-TOM Date: Fri, 17 Apr 2020 16:26:12 +0100 Subject: [PATCH] + Retrait et depot d'argent + Fetch all wallets for agent by her id --- app/Exceptions/Handler.php | 11 + .../Controllers/TransactionController.php | 77 +++-- app/Http/Controllers/WalletController.php | 20 +- app/Models/{AgentsPlus.php => AgentPlus.php} | 33 +- app/Models/WalletTransaction.php | 2 +- composer.json | 1 + composer.lock | 281 +++++++++++++++++- routes/web.php | 3 +- 8 files changed, 379 insertions(+), 49 deletions(-) rename app/Models/{AgentsPlus.php => AgentPlus.php} (68%) diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 63d31d4..4533dac 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -3,9 +3,11 @@ namespace App\Exceptions; use App\Traits\ApiResponser; +use GuzzleHttp\Exception\ServerException; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Auth\AuthenticationException; use Illuminate\Database\Eloquent\ModelNotFoundException; +use Illuminate\Database\QueryException; use Illuminate\Http\Response; use Illuminate\Validation\ValidationException; use Laravel\Lumen\Exceptions\Handler as ExceptionHandler; @@ -88,6 +90,15 @@ class Handler extends ExceptionHandler return $this->errorResponse($exception->getMessage(),Response::HTTP_UNAUTHORIZED); } + if ($exception instanceof QueryException) + { + return $this->errorResponse($exception->getMessage(),Response::HTTP_INTERNAL_SERVER_ERROR); + } + + if ($exception instanceof ServerException) + { + return $this->errorResponse($exception->getMessage(),Response::HTTP_INTERNAL_SERVER_ERROR); + } if( env('APP_DEBUG', false)) { diff --git a/app/Http/Controllers/TransactionController.php b/app/Http/Controllers/TransactionController.php index 600eca4..ef46221 100644 --- a/app/Http/Controllers/TransactionController.php +++ b/app/Http/Controllers/TransactionController.php @@ -2,10 +2,9 @@ namespace App\Http\Controllers; -use App\Models\AgentsPlus; +use App\Models\AgentPlus; use App\Models\CodeGenerer; use App\Models\ConfigWallet; -use App\Models\Network; use App\Models\NetworksAgent; use App\Models\Wallet; use App\Models\WalletAgent; @@ -39,45 +38,53 @@ class TransactionController extends Controller // Recuperation des wallets hyperviseur et superviseur $codeGenerer = CodeGenerer::findOrFail($network_agent->codeGenerer_id); - $superviseur = AgentsPlus::where('code_membre',$codeGenerer->code_parrain)->firstOrFail(); - $hyperviseur = AgentsPlus::where('code_membre',$superviseur->code_parrain)->firstOrFail(); + $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);;; + $walletSuperviseur = Wallet::findOrFail($wallet_agent_sup->wallet_id); + $walletHyperviseur = Wallet::findOrFail($wallet_agent_hyp->wallet_id); - $transaction->fill($request->all()); + $data = $request->all(); + $data['expiration_date'] = \DateTime::createFromFormat('m/Y',$request->expiration_date); + $transaction->fill($data); $client = new \GuzzleHttp\Client(); // Procedure de depot d'argent if($transaction->type == 'credit') { - $frais = $transaction->montant * $config->taux_com_client_depot; + $frais = $transaction->montant * $config->taux_com_client_depot / 100 ; - if($walletAgent->balance_princ >= ($transaction->montant + $config->taux_com_client_depot + $config->part_banque_depot)){ - //Requete vers la banque - // 1 ---> Emmètre via API sécurisé SSL une requête de débit de notre - //compte marchand la valeur égale au $montantDepot( montant de la - //transaction – la frais calculé en % - frais minimum fixe du - //dépôt client) et créditer sa carte visa de cette valeur + if($walletAgent->balance_princ >= ($transaction->montant + $frais + $config->frais_min_banque_depot)){ - $banqueCommission = floatval($config->frais_min_banque_depot * $config->part_banque_depot); - // 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 s’applique sur les frais minimum) et créditer - //le compte des opérations défini avec notre banque - //partenaire + $response = $client->post('https://ilink-app.com/mobilebackendtest/interacted/MembersAction.php'); + $code = $response->getStatusCode(); + if($code == 200){ + //Requete vers la banque + // 1 ---> Emmètre via API sécurisé SSL une requête de débit de notre + //compte marchand la valeur égale au $montantDepot( montant de la + //transaction – la frais calculé en % - frais minimum fixe du + //dépôt client) et créditer sa carte visa de cette valeur - $walletAgent->balance_princ -= $transaction->montant; + $banqueCommission = floatval($config->frais_min_banque_depot * $config->part_banque_depot / 100); + // 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 s’applique sur les frais minimum) et créditer + //le compte des opérations défini avec notre banque + //partenaire - $agentCommission = floatval($config->frais_min_banque_depot * $config->taux_com_ag_depot); - $superviseurCommission = floatval($config->frais_min_banque_depot * $config->taux_com_sup_depot); - $hyperviseurCommission = $frais + $config->frais_min_banque_depot - $superviseurCommission - $agentCommission - $banqueCommission; + $walletAgent->balance_princ -= $transaction->montant; + + $agentCommission = floatval($config->frais_min_banque_depot * $config->taux_com_ag_depot / 100); + $superviseurCommission = floatval($config->frais_min_banque_depot * $config->taux_com_sup_depot / 100); + $hyperviseurCommission = $frais + $config->frais_min_banque_depot - $superviseurCommission - $agentCommission - $banqueCommission; + + $walletAgent->balance_com += $agentCommission; + $walletSuperviseur->balance_com += $superviseurCommission; + $walletHyperviseur->balance_com += $hyperviseurCommission; + } - $walletAgent->balance_com += $agentCommission; - $walletSuperviseur->balance_com += $superviseurCommission; - $walletHyperviseur->balance_com += $hyperviseurCommission; }else{ return $this->errorResponse('Solde agent inferieur au montant de depot + frais + frais minimun de depot de la banque', Response::HTTP_BAD_REQUEST); } @@ -86,14 +93,17 @@ class TransactionController extends Controller }elseif ($transaction->type == 'debit') { - $frais = $transaction->montant * $config->taux_com_client_retrait; + $frais = $transaction->montant * $config->taux_com_client_retrait / 100; + $response = $client->post('https://ilink-app.com/mobilebackendtest/interacted/MembersAction.php'); + $code = $response->getStatusCode(); + if($code == 200) { //Requete vers la banque // 1 ---> Emmètre via API sécurisé SSL une requête de retrait du //(montant de la transaction + frais de transaction) pour débiter //sa carte et créditer notre compte marchand - $banqueCommission = floatval($transaction->montant * $config->part_banque_retrait); + $banqueCommission = floatval($transaction->montant * $config->part_banque_retrait / 100); // 2---> Emmètre via API sécurisé SSL une requête de débit de notre //compte marchand du (montant de la transaction multiplié //par la Part de la banque partenaire en % ) et créditer le @@ -101,15 +111,18 @@ class TransactionController extends Controller $walletAgent->balance_princ += $transaction->montant; - $agentCommission=floatval($transaction->montant*$config->taux_com_ag_retrait); - $superviseurCommission=floatval($transaction->montant*$config->taux_com_sup_retrait); - $hyperviseurCommission = $frais + $config->frais_min_banque_depot - $superviseurCommission - $agentCommission - $banqueCommission; + $agentCommission=floatval($transaction->montant*$config->taux_com_ag_retrait / 100); + $superviseurCommission=floatval($transaction->montant*$config->taux_com_sup_retrait / 100); + $hyperviseurCommission = $frais - $superviseurCommission - $agentCommission - $banqueCommission; +// dd(array($hyperviseurCommission ,$superviseurCommission)); $walletAgent->balance_com += $agentCommission; $walletSuperviseur->balance_com += $superviseurCommission; $walletHyperviseur->balance_com += $hyperviseurCommission; + } + } $transaction->date = new \DateTime(); diff --git a/app/Http/Controllers/WalletController.php b/app/Http/Controllers/WalletController.php index d3b6f79..b757060 100644 --- a/app/Http/Controllers/WalletController.php +++ b/app/Http/Controllers/WalletController.php @@ -2,12 +2,16 @@ namespace App\Http\Controllers; +use App\Models\Wallet; use App\Traits\ApiResponser; +use Illuminate\Http\Request; +use Illuminate\Http\Response; use Illuminate\Support\Facades\DB; class WalletController extends Controller { use ApiResponser; + /** * Create a new controller instance. * @@ -18,10 +22,20 @@ class WalletController extends Controller // } - public function activated(){ - $networks = DB::select('SELECT networks.name AS network,networks.status AS status,networks.id,countries.name AS country,networks.country_id , configWallet.id_network FROM `networks` - INNER JOIN countries ON networks.country_id=countries.id LEFT JOIN configWallet ON configWallet.id_network = networks.id WHERE status = 1 AND id_network IS NOT NULL'); + public function activated($id_agent) + { + + $networks = DB::select('SELECT na.network_id ,ne.name as network , countries.name AS country,ne.country_id , wallets.* FROM agents ag + INNER JOIN networks_agents na ON ag.id=na.agent_id INNER JOIN codeGenerer cg ON cg.id=na.codeGenerer_id INNER JOIN networks ne ON ne.id=na.network_id INNER JOIN countries ON ne.country_id=countries.id LEFT JOIN wallets ON na.id = wallets.id_networkAgent WHERE ag.id= :id AND network_id IN ( + SELECT networks.id FROM networks LEFT JOIN configWallet ON configWallet.id_network = networks.id WHERE status = 1 AND id_network IS NOT NULL)', ['id' => $id_agent]); return $this->successResponse($networks); } + + public function show($id_wallet) + { + $wallet = Wallet::findOrFail($id_wallet); + return $this->successResponse($wallet); + } + } diff --git a/app/Models/AgentsPlus.php b/app/Models/AgentPlus.php similarity index 68% rename from app/Models/AgentsPlus.php rename to app/Models/AgentPlus.php index 603a53b..ba07b93 100644 --- a/app/Models/AgentsPlus.php +++ b/app/Models/AgentPlus.php @@ -10,15 +10,17 @@ use Carbon\Carbon; use Illuminate\Database\Eloquent\Model; /** - * Class AgentsPlus + * Class AgentPlus * * @property int $id * @property string $uid * @property string $firstname + * @property string $adresse * @property string $lastname * @property string $email - * @property float $userlongitude - * @property float $userlatitude + * @property float $longitude + * @property float $latitude + * @property string $phone * @property int $active * @property Carbon $created * @property Carbon $openHours @@ -31,23 +33,27 @@ use Illuminate\Database\Eloquent\Model; * @property string $category * @property string $code_membre * @property int $number_geoBysuper + * @property int $network_id + * @property string $code_dial + * @property string $transactionNumber * * @package App\Models */ -class AgentsPlus extends Model +class AgentPlus extends Model { - protected $table = 'agents_plus'; + protected $table = 'agent_plus'; public $incrementing = false; public $timestamps = false; protected $casts = [ 'id' => 'int', - 'userlongitude' => 'float', - 'userlatitude' => 'float', + 'longitude' => 'float', + 'latitude' => 'float', 'active' => 'int', 'solde' => 'float', 'etat' => 'int', - 'number_geoBysuper' => 'int' + 'number_geoBysuper' => 'int', + 'network_id' => 'int' ]; protected $dates = [ @@ -60,10 +66,12 @@ class AgentsPlus extends Model 'id', 'uid', 'firstname', + 'adresse', 'lastname', 'email', - 'userlongitude', - 'userlatitude', + 'longitude', + 'latitude', + 'phone', 'active', 'created', 'openHours', @@ -75,6 +83,9 @@ class AgentsPlus extends Model 'code_parrain', 'category', 'code_membre', - 'number_geoBysuper' + 'number_geoBysuper', + 'network_id', + 'code_dial', + 'transactionNumber' ]; } diff --git a/app/Models/WalletTransaction.php b/app/Models/WalletTransaction.php index 4e091fd..4da6686 100644 --- a/app/Models/WalletTransaction.php +++ b/app/Models/WalletTransaction.php @@ -76,7 +76,7 @@ class WalletTransaction extends Model return [ 'montant'=> 'required|numeric|min:1', 'numCarte'=>'required|integer', - 'cvv'=>'required|integer|min:3|max:4', + 'cvv'=>'required|integer|min:100|max:999', 'expiration_date'=>'required|date_format:m/Y|after_or_equal:today', 'type' =>'required|in:credit,debit', 'id_wallet' => 'required|integer|min:0' diff --git a/composer.json b/composer.json index 13ff0b4..257d24a 100644 --- a/composer.json +++ b/composer.json @@ -6,6 +6,7 @@ "type": "project", "require": { "php": "^7.2.5", + "guzzlehttp/guzzle": "^6.5", "laravel/lumen-framework": "^7.0" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 513109e..b69ea6e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "4be8fced66fbffeff2568a82e343bfc0", + "content-hash": "4f5df1d5bb479b7274f68ed7be7e047b", "packages": [ { "name": "brick/math", @@ -292,6 +292,195 @@ ], "time": "2020-02-13T22:36:52+00:00" }, + { + "name": "guzzlehttp/guzzle", + "version": "6.5.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "43ece0e75098b7ecd8d13918293029e555a50f82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/43ece0e75098b7ecd8d13918293029e555a50f82", + "reference": "43ece0e75098b7ecd8d13918293029e555a50f82", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.6.1", + "php": ">=5.5" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.5-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2019-12-23T11:57:10+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2016-12-20T10:07:11+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + }, + "suggest": { + "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2019-07-01T23:21:34+00:00" + }, { "name": "illuminate/auth", "version": "v7.3.0", @@ -1986,6 +2175,56 @@ ], "time": "2019-01-08T18:20:26+00:00" }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + }, { "name": "psr/log", "version": "1.1.3", @@ -2081,6 +2320,46 @@ ], "time": "2017-10-23T01:57:42+00:00" }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "time": "2019-03-08T08:55:37+00:00" + }, { "name": "ramsey/collection", "version": "1.0.1", diff --git a/routes/web.php b/routes/web.php index 8e6b49a..beb413a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -20,5 +20,6 @@ $router->post('/virement','CommissionController@virement'); // Wallets routes $router->group(['prefix' => '/wallets'] , function () use ($router){ - $router->get('activated', 'WalletController@activated'); + $router->get('{id_agent}/activated', 'WalletController@activated'); + $router->get('{id_wallet}', 'WalletController@show'); });