+ Add credit limits group route

This commit is contained in:
Djery-Tom 2020-08-24 17:29:50 +01:00
parent 71ede45247
commit 5bf3c49034
12 changed files with 258 additions and 59 deletions

View File

@ -9,12 +9,14 @@ use App\Models\User;
use App\Models\Wallet;
use App\Models\WalletsUser;
use App\Traits\ApiResponser;
use App\Traits\Helper;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class HelperController extends Controller
{
use ApiResponser;
use Helper;
/**
* Create a new controller instance.
*

View File

@ -9,6 +9,7 @@ use App\Models\Identification;
use App\Models\NetworksAgent;
use App\Models\UsersDemandesCredit;
use App\Models\UsersGroup;
use App\Models\UsersGroupsDemandesValidation;
use App\Models\Wallet;
use App\Models\WalletAgent;
use App\Models\WalletsUser;
@ -92,31 +93,68 @@ class NanoCreditController extends Controller
if ($request->montant < $group->limite_credit)
return $this->errorResponse(trans('errors.nano_credit_amount_must_be_less_than_group_limit'));
//Verifier la capacité d'emprunt
$CE = $this->capaciteEmprunt($group->id);
if ($CE < 0)
return $this->errorResponse("Le groupe n'a pas le droit d'emprenunter");
if ($request->montant > $CE)
return $this->errorResponse("La capicite d'emprunt est dépassé");
$walletUser = WalletsUser::where('idUser', $request->id_user)->firstOrFail();
//Verifier si le solde principal de l'hyperviseur est superieur au montant
$walletHyper = WalletAgent::where('category', 'hyper')->where('network_id', $config->id_network)->firstOrFail();
$demande_credit->frais = $this->calculateFees($paliers, $request->montant, $request->duree_mois);
$demande_credit->taxe = $this->calculateTax($taxes, $demande_credit->frais);
$demande_credit->date_demande = new \DateTime();
$demande_credit->date_remboursement_prevu = $demande_credit->date_demande->modify('+' . $request->duree_mois . ' month');
$demande_credit->etat = 'VALIDE';
$demande_credit->id_demande = $this->getNanoCreditDemandID();
$montant_total = $demande_credit->montant + $demande_credit->frais + $demande_credit->taxe;
if ($request->montant > $walletHyper->balance_princ) {
$demande_credit->etat = 'EN_ATTENTE_DE_VALIDATION';
$demande_credit->save();
$user->balance_credit += $montant_total;
$walletUser->balance += $demande_credit->montant;
$user->save();
$walletUser->save();
$demande_credit->save();
$demande = new UsersGroupsDemandesValidation();
$demande->id_group = $group->id;
$demande->id_user = $user->id;
$demande->id_demande = $demande_credit->id_demande;
$demande->id_agent = $walletHyper->agent_id;
$demande->date_creation = new \DateTime();
$demande->statut = false;
$demande->type = 'nano_credit';
$demande->save();
$message = trans('messages.successful_user_group_nano_credit_demand',
['id_demand' => $demande_credit->id_demande, 'amount' => $this->toMoney($montant_total, $init_country),
'net' => $this->toMoney($demande_credit->montant, $init_country), 'fees' => $this->toMoney($demande_credit->frais + $demande_credit->taxe, $init_country),
'date' => $demande_credit->date_remboursement_prevu]);
$this->sendMail($user->email, trans('messages.successful_nano_credit_demand'), $message);
return $this->successResponse($message . trans('messages.sent_by_mail'));
$data = new \stdClass();
$data->screen = "notificationview";
$data->data = new \stdClass();
$data->data->id = $demande->id;
$this->sendPushNotificationToAgent($walletHyper->codeMembre,
trans('notifications.group_nano_credit_request', ['name' => $group->nom]), $data);
return $this->successResponse(trans('messages.successful_nano_credit_sent_to_hypervisor'));
} else {
$walletHyper = Wallet::findOrFail($walletHyper->wallet_id);
$walletUser = WalletsUser::where('idUser', $request->id_user)->firstOrFail();
$demande_credit->date_demande = new \DateTime();
$demande_credit->date_remboursement_prevu = $demande_credit->date_demande->modify('+' . $request->duree_mois . ' month');
$demande_credit->etat = 'VALIDE';
$montant_total = $demande_credit->montant + $demande_credit->frais + $demande_credit->taxe;
$user->balance_credit += $montant_total;
$walletUser->balance += $demande_credit->montant;
$walletHyper->balance_princ -= $demande_credit->montant;
$user->save();
$walletUser->save();
$walletHyper->save();
$demande_credit->save();
$message = trans('messages.successful_user_group_nano_credit_demand',
['id_demand' => $demande_credit->id_demande, 'amount' => $this->toMoney($montant_total, $init_country),
'net' => $this->toMoney($demande_credit->montant, $init_country), 'fees' => $this->toMoney($demande_credit->frais + $demande_credit->taxe, $init_country),
'date' => $demande_credit->date_remboursement_prevu]);
$this->sendMail($user->email, trans('messages.successful_nano_credit_demand'), $message);
return $this->successResponse($message . trans('messages.sent_by_mail'));
}
}
if ($request->type_caution == 'individuel') {
@ -145,6 +183,7 @@ class NanoCreditController extends Controller
$this->validate($request, [
'id_demande' => 'required',
'id_wallet_agent' => 'required|integer|min:0|not_in:0',
'retrait_cash' => 'required|boolean',
'password' => 'required',
]);
@ -152,19 +191,12 @@ class NanoCreditController extends Controller
$network_agent = NetworksAgent::findOrFail($walletAgent->id_networkAgent);
$agent_country = $network_agent->network->country->id;
// 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_hyp = WalletAgent::where('agent_id', $hyperviseur->id)->firstOrFail();
$walletHyperviseur = Wallet::findOrFail($wallet_agent_hyp->wallet_id);
$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'));
$demande_credit = UsersDemandesCredit::where('id_demande', $request->id_demande)->first();
$demande_credit->retrait_cash = $request->retrait_cash;
if (!$demande_credit)
return $this->errorResponse(trans('errors.nano_credit_not_found'));
@ -193,12 +225,17 @@ class NanoCreditController extends Controller
$demande_credit->id_wallet_agent = $walletAgent->id;
$user->balance_credit += $montant_total;
$walletHyperviseur->balance_princ += $demande_credit->montant;
$walletAgent->balance_princ -= $montant_total;
$walletAgent->save();
$walletHyperviseur->save();
$user->save();
//Crediter le wallet de client s'il ne retire pas en cash
if (!$request->retrait_cash) {
$walletUser = WalletsUser::where('idUser', $request->id_user)->firstOrFail();
$walletUser->balance += $demande_credit->montant;
$walletUser->save();
}
$walletAgent->save();
$user->save();
$demande_credit->save();
$user_message = trans('messages.successful_guarantee_user_individual_nano_credit_demand',
@ -277,6 +314,20 @@ class NanoCreditController extends Controller
return $this->successResponse($message . trans('messages.sent_by_mail'));
}
// Calculer la capacité d'emprunt
private function capaciteEmprunt($id_group)
{
$users = User::where('group_id', $id_group)->get();
$sommeCredits = 0;
$sommeEpargnes = 0;
foreach ($users as $user) {
$sommeCredits += $user->balance_credit;
$sommeEpargnes += $user->balance_epargne;
}
return $sommeEpargnes - $sommeCredits;
}
// Calculer les frais
private function calculateFees(array $paliers, $montant, $duree)
{

View File

@ -4,8 +4,12 @@ namespace App\Http\Controllers;
use App\Models\ConfigWallet;
use App\Models\Identification;
use App\Models\UsersDemandesCredit;
use App\Models\UsersGroup;
use App\Models\UsersGroupsDemandesValidation;
use App\Models\Wallet;
use App\Models\WalletAgent;
use App\Models\WalletsUser;
use App\Traits\ApiResponser;
use App\Traits\Helper;
use Illuminate\Http\Request;
@ -135,8 +139,9 @@ class UserGroupController extends Controller
if ($demande->statut != 0)
return $this->errorResponse(trans('errors.treated_group_demand'));
if ($demande->id_sponsor != $request->id_user)
return $this->errorResponse(trans('errors.not_group_sponsor'));
if ($demande->type != 'nano_credit')
if ($demande->id_sponsor != $request->id_user)
return $this->errorResponse(trans('errors.not_group_sponsor'));
if ($demande->type == 'creation')
return $this->validateGroupCreationDemand($request, $demande);
@ -144,6 +149,8 @@ class UserGroupController extends Controller
return $this->validateDeletingGroupDemand($request, $demande);
if ($demande->type == 'adhesion')
return $this->validateMembershipGroupDemand($request, $demande);
if ($demande->type == 'nano_credit')
return $this->validateNanoCreditGroupDemand($request, $demande);
}
@ -193,8 +200,9 @@ class UserGroupController extends Controller
if ($demande->statut != 0)
return $this->errorResponse(trans('errors.treated_group_demand'));
if ($demande->id_sponsor != $request->id_user)
return $this->errorResponse(trans('errors.not_group_sponsor'));
if ($demande->type != 'nano_credit')
if ($demande->id_sponsor != $request->id_user)
return $this->errorResponse(trans('errors.not_group_sponsor'));
$sponsor = User::findOrFail($request->id_user);
@ -228,7 +236,14 @@ class UserGroupController extends Controller
$this->sendPushNotificationToUser($user->user_code,
trans('notifications.successful_canceled_group_membership_request', ['name' => $sponsor->lastname . ' ' . $sponsor->firstname]), $data);
return $this->successResponse(trans('messages.successful_refused_group_deleting'));
return $this->successResponse(trans('messages.successful_canceled_group_membership_request'));
}
if ($demande->type == 'nano_credit') {
$user = User::findOrFail($demande->id_user);
$this->sendPushNotificationToUser($user->user_code, trans('notifications.refused_group_nano_credit_request'), $data);
return $this->successResponse(trans('messages.successful_canceled_nano_credit_request'));
}
}
@ -521,7 +536,8 @@ ug.date_creation , ug.createur , ug.sponsor1 , ug.sponsor2 , ug.sponsor3, ug.cou
{
$groupe = collect(DB::select('SELECT ug.code_groupe , ug.nom , ug.limite_credit , ug.nombre_validation, ug.actif, ug.nombre_utilisateurs,
ug.date_creation , ug.createur , ug.sponsor1 , ug.sponsor2 , ug.sponsor3, ug.country, ug.currency_code, ug.id_createur FROM infos_users_groups ug
ug.date_creation , ug.createur , ug.sponsor1 , ug.sponsor2 , ug.sponsor3, ug.country, ug.currency_code, ug.id_createur , code_sponsor1 as codeSponsor1 , code_sponsor2 as codeSponsor2,
code_sponsor3 as codeSponsor3 FROM infos_users_groups ug
INNER JOIN users u ON ug.id = u.group_id WHERE u.user_code = :code', ['code' => $code_user]))->first();
if ($groupe)
@ -531,6 +547,79 @@ ug.date_creation , ug.createur , ug.sponsor1 , ug.sponsor2 , ug.sponsor3, ug.cou
}
public function myGroupLimits($code_user)
{
$user = User::where('user_code', $code_user)->firstOrFail();
$country = $user->network->country;
$init_country = $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);
$rep = new \stdClass();
$rep->limite_credit_min = $config->limite_credit_min;
$rep->limite_credit_max = $config->limite_credit_max;
$rep->currency_code = $country->currency->code;
return $this->successResponse($rep);
} else {
return $this->errorResponse(trans('errors.no_ilink_network'));
}
}
private function validateNanoCreditGroupDemand(Request $request, UsersGroupsDemandesValidation $demande)
{
$walletHyper = WalletAgent::where('agent_id', $demande->id_agent)->firstOrFail();
$demande_credit = UsersDemandesCredit::where('id_demande', $demande->id_demande)->firstOrFail();
if ($demande_credit->montant > $walletHyper->balance_princ)
return $this->errorResponse(trans('errors.insufficient_balance'));
$currency_code = $walletHyper->currency_code;
$walletHyper = Wallet::findOrFail($walletHyper->wallet_id);
$user = User::findOrFail($demande->id_user);
$walletUser = WalletsUser::where('idUser', $request->id_user)->firstOrFail();
$montant_total = $demande_credit->montant + $demande_credit->frais + $demande_credit->taxe;
$demande_credit->date_demande = new \DateTime();
$demande_credit->date_remboursement_prevu = $demande_credit->date_demande->modify('+' . $demande_credit->duree_mois . ' month');
$demande_credit->etat = 'VALIDE';
$user->balance_credit += $montant_total;
$walletUser->balance += $demande_credit->montant;
$walletHyper->balance_princ -= $demande_credit->montant;
$demande->statut = true;
$demande->date_validation = new \DateTime();
$user->save();
$walletUser->save();
$walletHyper->save();
$demande_credit->save();
$demande->save();
// Notififier l'utilisateur
$data = new \stdClass();
$data->screen = "notificationview";
$data->data = new \stdClass();;
$data->data->id = $request->id_demande;
$this->sendPushNotificationToUser($user->user_code, trans('notifications.accepted_group_nano_credit_request'), $data);
$message = trans('messages.successful_user_group_nano_credit_demand',
['id_demand' => $demande_credit->id_demande, 'amount' => $this->toMoneyWithCurrencyCode($montant_total, $currency_code),
'net' => $this->toMoneyWithCurrencyCode($demande_credit->montant, $currency_code), 'fees' => $this->toMoneyWithCurrencyCode($demande_credit->frais + $demande_credit->taxe, $currency_code),
'date' => $demande_credit->date_remboursement_prevu]);
$this->sendMail($user->email, trans('messages.successful_nano_credit_demand'), $message);
return $this->successResponse(trans('messages.successful_accepted_nano_credit_request'));
}
private function checkSponsorIdentification($code_sponsor, $id, $init_country)
{
$sponsor = User::where('user_code', $code_sponsor)->first();

View File

@ -25,29 +25,31 @@ use Illuminate\Database\Eloquent\Model;
* @property Carbon $date_remboursement
* @property int $id_user
* @property int $id_wallet_agent
* @property bool $retrait_cash
* @property Carbon $date_creation
*
* @package App\Models
*/
class UsersDemandesCredit extends Model
{
protected $table = 'users_demandes_credits';
public $incrementing = false;
public $timestamps = false;
protected $casts = [
'id' => 'int',
'montant' => 'float',
'duree_mois' => 'int',
'frais' => 'float',
'taxe' => 'float',
'id_user' => 'int',
'id_wallet_agent' => 'int'
'id_wallet_agent' => 'int',
'retrait_cash' => 'bool'
];
protected $dates = [
'date_demande',
'date_remboursement_prevu',
'date_remboursement'
'date_remboursement',
'date_creation'
];
protected $fillable = [
@ -62,6 +64,8 @@ class UsersDemandesCredit extends Model
'date_remboursement_prevu',
'date_remboursement',
'id_user',
'id_wallet_agent'
'id_wallet_agent',
'retrait_cash',
'date_creation'
];
}

View File

@ -16,6 +16,8 @@ use Illuminate\Database\Eloquent\Model;
* @property int $id_group
* @property int $id_sponsor
* @property int $id_user
* @property int $id_agent
* @property string $id_demande
* @property int $statut
* @property Carbon $date_validation
* @property Carbon $date_creation
@ -32,6 +34,7 @@ class UsersGroupsDemandesValidation extends Model
'id_group' => 'int',
'id_sponsor' => 'int',
'id_user' => 'int',
'id_agent' => 'int',
'statut' => 'int'
];
@ -44,6 +47,8 @@ class UsersGroupsDemandesValidation extends Model
'id_group',
'id_sponsor',
'id_user',
'id_agent',
'id_demande',
'statut',
'date_validation',
'date_creation',

View File

@ -11,15 +11,21 @@ use Illuminate\Database\Eloquent\Model;
/**
* Class WalletAgent
*
*
* @property int $wallet_id
* @property float $balance_princ
* @property float $balance_com
* @property Carbon $created_date
* @property int $networks_agent_id
* @property int $agent_id
* @property string $lastname
* @property string $codeMembre
* @property string $codeParrain
* @property string $category
* @property int $network_id
* @property string $network
* @property string $currency_code
* @property string $transactionNumber
*
* @package App\Models
*/
@ -30,25 +36,32 @@ class WalletAgent extends Model
public $timestamps = false;
protected $casts = [
'wallet_id' => 'int',
'balance_princ' => 'float',
'balance_com' => 'float',
'agent_id' => 'int',
'network_id' => 'int'
];
'wallet_id' => 'int',
'balance_princ' => 'float',
'balance_com' => 'float',
'networks_agent_id' => 'int',
'agent_id' => 'int',
'network_id' => 'int'
];
protected $dates = [
'created_date'
];
protected $fillable = [
'wallet_id',
'balance_princ',
'balance_com',
'created_date',
'agent_id',
'lastname',
'network_id',
'network'
];
'wallet_id',
'balance_princ',
'balance_com',
'created_date',
'networks_agent_id',
'agent_id',
'lastname',
'codeMembre',
'codeParrain',
'category',
'network_id',
'network',
'currency_code',
'transactionNumber'
];
}

View File

@ -61,6 +61,22 @@ trait Helper
// return $response->getBody()->getContents();
}
public function sendPushNotificationToAgent($agent_code, $message, $data = null)
{
$client = new \GuzzleHttp\Client([
'base_uri' => env('NOTIFICATION_SERVICE_URL'),
]);
$headers = [
'Authorization' => env('NOTIFICATION_SERVICE_KEY'),
];
$body = new \stdClass();
$body->agent_code = $agent_code;
$body->message = $message;
$body->data = $data;
$promise = $client->requestAsync('POST', '/onesignal/pushToAgent', ['json' => $body, 'headers' => $headers])->then();
$promise->wait();
}
public function checkPassword($password, $encrypted_password, $salt)
{
$encrypted_password_to_check = base64_encode(sha1($password . $salt, true) . $salt);
@ -88,24 +104,30 @@ trait Helper
$currency = collect(DB::select('SELECT cu.code FROM networks n INNER JOIN countries c ON c.id = n.country_id INNER JOIN currencies cu ON cu.id = c.idCurrency
WHERE n.id = :id',['id'=>$id_network]))->first();
$money = Money::of(round($amount, 2),$currency ? $currency->code : 'XAF',new AutoContext());
$money = Money::of(round($amount, 2), $currency ? $currency->code : 'XAF', new AutoContext());
return $money->formatTo('fr_FR');
}
public function toMoney($amount, $id_country)
{
$country = Country::findOrFail($id_country);
$money = Money::of(round($amount, 2),$country->currency->code,new AutoContext());
$money = Money::of(round($amount, 2), $country->currency->code, new AutoContext());
return $money->formatTo('fr_FR');
}
private function convertMoney($amount , $init_country , $final_country)
public function toMoneyWithCurrencyCode($amount, $currency_code)
{
$money = Money::of(round($amount, 2), $currency_code, new AutoContext());
return $money->formatTo('fr_FR');
}
private function convertMoney($amount, $init_country, $final_country)
{
// set to whatever your rates are relative to
$baseCurrency = 'USD';
// use your own credentials, or re-use your existing PDO connection
$pdo = new PDO('mysql:host=' .env('DB_HOST') . ';dbname=' .env('DB_DATABASE'), env('DB_USERNAME'), env('DB_PASSWORD'));
$pdo = new PDO('mysql:host=' . env('DB_HOST') . ';dbname=' . env('DB_DATABASE'), env('DB_USERNAME'), env('DB_PASSWORD'));
$configuration = new PDOProviderConfiguration();

View File

@ -210,4 +210,7 @@ Request Information:
- Net amount received: :net",
'successful_accepted_group_membership_request' => "Membership request accepted",
'successful_canceled_group_membership_request' => "Membership request refused",
'successful_nano_credit_sent_to_hypervisor' => "Your request has been sent to your network hypervisor. You will receive the credit only after validation",
'successful_accepted_nano_credit_request' => "Nano credit request accepted",
'successful_canceled_nano_credit_request' => "Nano credit request refused"
];

View File

@ -9,4 +9,7 @@ return [
"group_membership_request" => ":name has sent you a group membership request",
"accepted_group_membership_request" => ":name has accepted your group membership request",
"refused_group_membership_request" => ":name has refused your group membership request",
"group_nano_credit_request" => "You have received a request for nano credit from the group :name",
"accepted_group_nano_credit_request" => "Your hypervisor has accepted your nano credit request",
"refused_group_nano_credit_request" => "Your hypervisor has refused your nanocredit request",
];

View File

@ -210,4 +210,7 @@ Informations de la demande :
- Montant net à percu : :net",
'successful_accepted_group_membership_request' => "Demande d'adhésion acceptée",
'successful_canceled_group_membership_request' => "Demande d'adhésion refusée",
'successful_nano_credit_sent_to_hypervisor' => "Votre demande a été envoyé à l'hyperviseur de votre reseau. Vous recevrez le credit seulement après validation",
'successful_accepted_nano_credit_request' => "Demande de nano credit acceptée",
'successful_canceled_nano_credit_request' => "Demande de nano credit refusée"
];

View File

@ -9,4 +9,7 @@ return [
"group_membership_request" => ":name vous a envoyé une demande d'adhésion de groupe",
"accepted_group_membership_request" => ":name a accepté votre demande d'adhésion de groupe",
"refused_group_membership_request" => ":name a refusé votre demande d'adhésion de groupe",
"group_nano_credit_request" => "Vous avez reçu une demande de nano crédit du groupe :name",
"accepted_group_nano_credit_request" => "Votre hyperviseur a accepté votre demande de nano credit",
"refused_group_nano_credit_request" => "Votre hyperviseur a refusé votre demande de nano credit",
];

View File

@ -76,6 +76,7 @@ $router->group(['prefix' => '/groups'], function () use ($router) {
$router->post('join', 'UserGroupController@joinGroup');
$router->delete('', 'UserGroupController@deleteGroup');
$router->get('my/{code_user}', 'UserGroupController@myGroup');
$router->get('limits/{code_user}', 'UserGroupController@myGroupLimits');
// Demandes de validation
$router->group(['prefix' => '/demands'], function () use ($router) {