+ Automatic reimbursement of credit requests at midnight
+ Regulations limits
This commit is contained in:
parent
aa1b551d97
commit
5f2d68a7da
|
@ -2,11 +2,14 @@
|
|||
|
||||
namespace App\Console;
|
||||
|
||||
use App\Traits\Helper;
|
||||
use Illuminate\Console\Scheduling\Schedule;
|
||||
use Laravel\Lumen\Console\Kernel as ConsoleKernel;
|
||||
|
||||
class Kernel extends ConsoleKernel
|
||||
{
|
||||
use Helper;
|
||||
|
||||
/**
|
||||
* The Artisan commands provided by your application.
|
||||
*
|
||||
|
@ -24,6 +27,10 @@ class Kernel extends ConsoleKernel
|
|||
*/
|
||||
protected function schedule(Schedule $schedule)
|
||||
{
|
||||
//
|
||||
// Tache cron s'execute tous les jours a minuit
|
||||
$schedule->call(function () {
|
||||
$this->refundAllNanoCredit();
|
||||
})->dailyAt('00:00')->runInBackground();
|
||||
// })->everyMinute()->runInBackground();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Jobs\TestJob;
|
||||
use App\Models\ConfigWallet;
|
||||
use App\Models\Country;
|
||||
use App\Models\NetworksAgent;
|
||||
|
@ -17,6 +18,7 @@ class HelperController extends Controller
|
|||
{
|
||||
use ApiResponser;
|
||||
use Helper;
|
||||
|
||||
/**
|
||||
* Create a new controller instance.
|
||||
*
|
||||
|
@ -104,15 +106,18 @@ class HelperController extends Controller
|
|||
public function init(){
|
||||
//Mettre a jour tous les utilisateurs qui n'ont pas de wallet iLink
|
||||
$users = User::whereNull('user_code')->orWhere('user_code','')->get();
|
||||
foreach ($users as $user){
|
||||
do{
|
||||
$user_code=$this->generateUserCode();
|
||||
$result = collect(DB::select('SELECT * FROM users WHERE user_code = :code',['code'=>$user_code]));
|
||||
$codeCorrect=sizeof($result)<0;
|
||||
}while($codeCorrect);
|
||||
foreach ($users as $user) {
|
||||
do {
|
||||
$user_code = $this->generateUserCode();
|
||||
$result = collect(DB::select('SELECT * FROM users WHERE user_code = :code', ['code' => $user_code]));
|
||||
$codeCorrect = sizeof($result) < 0;
|
||||
} while ($codeCorrect);
|
||||
$user->user_code = $user_code;
|
||||
DB::insert('INSERT INTO wallets_users (idUser) VALUES (?);', [$user->id]);
|
||||
$user->save();
|
||||
$wallet = WalletsUser::where('idUser', $user->id)->first();
|
||||
if (!$wallet) {
|
||||
DB::insert('INSERT INTO wallets_users (idUser) VALUES (?);', [$user->id]);
|
||||
$user->save();
|
||||
}
|
||||
}
|
||||
return $this->successResponse('OK :-) , Have a nice day dear ! ');
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ use App\Models\ConfigWallet;
|
|||
use App\Models\Identification;
|
||||
use App\Models\InfosUsersGroup;
|
||||
use App\Models\NetworksAgent;
|
||||
use App\Models\User;
|
||||
use App\Models\UsersDemandesCredit;
|
||||
use App\Models\UsersEpargne;
|
||||
use App\Models\UsersGroup;
|
||||
|
@ -18,8 +19,6 @@ use App\Models\WalletsUser;
|
|||
use App\Traits\ApiResponser;
|
||||
use App\Traits\Helper;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\User;
|
||||
use Illuminate\Support\Facades\Date;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class NanoCreditController extends Controller
|
||||
|
@ -235,7 +234,7 @@ class NanoCreditController extends Controller
|
|||
$user_country = $user->network->country->id;
|
||||
|
||||
if ($user_country != $agent_country)
|
||||
return $this->errorResponse('errors.operation_cannot_performed_in_country');
|
||||
return $this->errorResponse(trans('errors.operation_cannot_performed_in_country'));
|
||||
|
||||
$montant_total = $demande_credit->montant + $demande_credit->interet + $demande_credit->taxe;
|
||||
|
||||
|
@ -288,7 +287,6 @@ class NanoCreditController extends Controller
|
|||
]);
|
||||
|
||||
$user = User::findOrFail($request->id_user);
|
||||
$group = InfosUsersGroup::findOrFail($user->group_id);
|
||||
if (!$this->checkPassword($request->password, $user->encrypted_password, $user->salt))
|
||||
return $this->errorResponse(trans('messages.incorrect_user_password'));
|
||||
|
||||
|
@ -338,8 +336,9 @@ class NanoCreditController extends Controller
|
|||
}
|
||||
|
||||
if ($demande_credit->type_caution == 'groupe') {
|
||||
// Recuperation des wallets hyperviseur et superviseur
|
||||
$group = InfosUsersGroup::findOrFail($user->group_id);
|
||||
|
||||
// Recuperation des wallets hyperviseur et superviseur
|
||||
$walletHyper = WalletAgent::where('category', 'hyper')->where('network_id', $group->id_network)->firstOrFail();
|
||||
$walletHyper = Wallet::findOrFail($walletHyper->wallet_id);
|
||||
|
||||
|
|
|
@ -9,21 +9,20 @@ use App\Models\Country;
|
|||
use App\Models\Identification;
|
||||
use App\Models\NetworksAgent;
|
||||
use App\Models\PayingNetwork;
|
||||
use App\Models\Regulation;
|
||||
use App\Models\TypeIlinkTransaction;
|
||||
use App\Models\PaliersConfigWallet;
|
||||
use App\Models\User;
|
||||
use App\Models\Wallet;
|
||||
use App\Models\WalletAgent;
|
||||
use App\Models\WalletIlinkTransaction;
|
||||
use App\Models\WalletsUser;
|
||||
use App\Models\WalletTransaction;
|
||||
use App\Traits\ApiResponser;
|
||||
use App\Traits\Helper;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Response;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use function DeepCopy\deep_copy;
|
||||
use function GuzzleHttp\Promise\all;
|
||||
|
||||
class iLinkTransactionController extends Controller
|
||||
{
|
||||
|
@ -128,11 +127,21 @@ class iLinkTransactionController extends Controller
|
|||
$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)
|
||||
return $this->checkUserIdentification($user->id);
|
||||
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, $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;
|
||||
|
@ -272,11 +281,20 @@ class iLinkTransactionController extends Controller
|
|||
$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)
|
||||
return $this->checkUserIdentification($user->id);;
|
||||
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, $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;
|
||||
|
@ -364,7 +382,10 @@ class iLinkTransactionController extends Controller
|
|||
if ($request->montant > $walletUser->balance) {
|
||||
return $this->errorResponse(trans('errors.insufficient_balance'));
|
||||
} else {
|
||||
return $this->checkUserIdentification($user->id);;
|
||||
$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);
|
||||
|
@ -463,7 +484,9 @@ class iLinkTransactionController extends Controller
|
|||
$this->validate($request, $transaction->user_card_rules());
|
||||
$user = $walletUser->user;
|
||||
if ($this->checkPassword($request->password, $user->encrypted_password, $user->salt)) {
|
||||
return $this->checkUserIdentification($user->id);;
|
||||
$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'));
|
||||
|
@ -479,7 +502,7 @@ class iLinkTransactionController extends Controller
|
|||
$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;
|
||||
$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);
|
||||
|
@ -688,6 +711,11 @@ class iLinkTransactionController extends Controller
|
|||
$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, $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;
|
||||
|
@ -735,6 +763,12 @@ class iLinkTransactionController extends Controller
|
|||
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, $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;
|
||||
|
@ -865,6 +899,12 @@ class iLinkTransactionController extends Controller
|
|||
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, $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;
|
||||
|
@ -1370,4 +1410,51 @@ class iLinkTransactionController extends Controller
|
|||
return $this->successResponse(trans('messages.canceled_transaction'));
|
||||
}
|
||||
|
||||
//Verfier les limites reglementaires
|
||||
public function checkReguationsLimits($identifiant, $init_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)->whereDate('date', Carbon::today())->sum('montant');
|
||||
else
|
||||
$daily_sum = WalletIlinkTransaction::where('id_wallet_user', $identifiant)->whereDate('date', Carbon::today())->sum('montant');
|
||||
$amount_admitted = $regulation->montant_max_jour - $daily_sum;
|
||||
// dd(($daily_sum + $montant_transaction) > $regulation->montant_max_jour);
|
||||
if (($daily_sum + $montant_transaction) > $regulation->montant_max_jour)
|
||||
return $this->errorResponse(trans('errors.daily_regulations_limits_reached') . '\n'
|
||||
. ($amount_admitted > 0 ? trans('errors.regulations_limits_amount_transaction', ['amount' => $this->toMoney($amount_admitted, $init_country)]) : ''));
|
||||
|
||||
// Total montants hebdomadaire
|
||||
// To set the week start/end:
|
||||
// Carbon::setLocale('en_US'); // Set week to start on Sunday
|
||||
// Carbon::setWeekStartsAt(Carbon::SUNDAY);
|
||||
// Carbon::setWeekEndsAt(Carbon::SATURDAY);
|
||||
if ($is_id_document_emetteur)
|
||||
$weekly_sum = WalletIlinkTransaction::where('id_document_emetteur', $identifiant)->whereBetween('date', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->sum('montant');
|
||||
else
|
||||
$weekly_sum = WalletIlinkTransaction::where('id_wallet_user', $identifiant)->whereBetween('date', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->sum('montant');
|
||||
$amount_admitted = $regulation->montant_max_hedbo - $weekly_sum;
|
||||
if (($weekly_sum + $montant_transaction) > $regulation->montant_max_hebdo)
|
||||
return $this->errorResponse(trans('errors.weekly_regulations_limits_reached') . '\n'
|
||||
. ($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)->whereBetween('date', [Carbon::now()->startOfMonth(), Carbon::now()->endOfMonth()])->sum('montant');
|
||||
else
|
||||
$monthly_sum = WalletIlinkTransaction::where('id_wallet_user', $identifiant)->whereBetween('date', [Carbon::now()->startOfMonth(), Carbon::now()->endOfMonth()])->sum('montant');
|
||||
$amount_admitted = $regulation->montant_max_mensuel - $monthly_sum;
|
||||
if (($monthly_sum + $montant_transaction) > $regulation->montant_max_mensuel)
|
||||
return $this->errorResponse(trans('errors.monthly_regulations_limits_reached') . '\n'
|
||||
. ($amount_admitted > 0 ? trans('errors.regulations_limits_amount_transaction', ['amount' => $this->toMoney($amount_admitted, $init_country)]) : ''));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ use Illuminate\Database\Eloquent\Model;
|
|||
|
||||
/**
|
||||
* Class Country
|
||||
*
|
||||
*
|
||||
* @property int $id
|
||||
* @property string $code_dial
|
||||
* @property string $name
|
||||
|
@ -19,7 +19,7 @@ use Illuminate\Database\Eloquent\Model;
|
|||
* @property float $longitude
|
||||
* @property float $latitude
|
||||
* @property int $idCurrency
|
||||
*
|
||||
*
|
||||
* @property Currency $currency
|
||||
* @property Collection|Admin[] $admins
|
||||
* @property Collection|ConfigGame[] $config_games
|
||||
|
@ -63,13 +63,18 @@ class Country extends Model
|
|||
return $this->hasMany(ConfigGame::class, 'id_pays');
|
||||
}
|
||||
|
||||
public function identifications()
|
||||
{
|
||||
return $this->hasMany(Identification::class);
|
||||
}
|
||||
public function identifications()
|
||||
{
|
||||
return $this->hasMany(Identification::class);
|
||||
}
|
||||
|
||||
public function wallet_ilink_transactions()
|
||||
{
|
||||
return $this->hasMany(WalletIlinkTransaction::class, 'final_country');
|
||||
}
|
||||
public function wallet_ilink_transactions()
|
||||
{
|
||||
return $this->hasMany(WalletIlinkTransaction::class, 'final_country');
|
||||
}
|
||||
|
||||
public function regulation()
|
||||
{
|
||||
return $this->belongsTo(Regulation::class, 'id_country');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Created by Reliese Model.
|
||||
*/
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
/**
|
||||
* Class Regulation
|
||||
*
|
||||
* @property int $id
|
||||
* @property int $id_country
|
||||
* @property float $montant_max_jour
|
||||
* @property float $montant_max_hebdo
|
||||
* @property float $montant_max_mensuel
|
||||
*
|
||||
* @package App\Models
|
||||
*/
|
||||
class Regulation extends Model
|
||||
{
|
||||
protected $table = 'regulations';
|
||||
public $timestamps = false;
|
||||
|
||||
protected $casts = [
|
||||
'id_country' => 'int',
|
||||
'montant_max_jour' => 'float',
|
||||
'montant_max_hebdo' => 'float',
|
||||
'montant_max_mensuel' => 'float'
|
||||
];
|
||||
|
||||
protected $fillable = [
|
||||
'id_country',
|
||||
'montant_max_jour',
|
||||
'montant_max_hebdo',
|
||||
'montant_max_mensuel'
|
||||
];
|
||||
}
|
|
@ -15,6 +15,8 @@ use Illuminate\Database\Eloquent\Model;
|
|||
* @property int $id
|
||||
* @property string $id_demande
|
||||
* @property float $montant
|
||||
* @property float $montant_rembourse
|
||||
* @property bool partiellement_rembourse;
|
||||
* @property int $duree_mois
|
||||
* @property string $type_caution
|
||||
* @property string $etat
|
||||
|
@ -38,6 +40,8 @@ class UsersDemandesCredit extends Model
|
|||
|
||||
protected $casts = [
|
||||
'montant' => 'float',
|
||||
'montant_rembourse' => 'float',
|
||||
'partiellement_rembourse' => 'bool',
|
||||
'duree_mois' => 'int',
|
||||
'interet' => 'float',
|
||||
'taxe' => 'float',
|
||||
|
@ -57,6 +61,8 @@ class UsersDemandesCredit extends Model
|
|||
protected $fillable = [
|
||||
'id_demande',
|
||||
'montant',
|
||||
'montant_rembourse',
|
||||
'partiellement_rembourse',
|
||||
'duree_mois',
|
||||
'type_caution',
|
||||
'etat',
|
||||
|
|
|
@ -4,24 +4,31 @@
|
|||
namespace App\Traits;
|
||||
|
||||
|
||||
use App\Models\AgentPlus;
|
||||
use App\Models\CodeGenerer;
|
||||
use App\Models\ConfigWallet;
|
||||
use App\Models\CountriesCurrency;
|
||||
use App\Models\Country;
|
||||
use App\Models\Identification;
|
||||
use App\Models\InfosUsersGroup;
|
||||
use App\Models\Network;
|
||||
use App\Models\NetworksAgent;
|
||||
use App\Models\User;
|
||||
use App\Models\UsersDemandesCredit;
|
||||
use App\Models\Wallet;
|
||||
use App\Models\WalletAgent;
|
||||
use App\Models\WalletsUser;
|
||||
use Brick\Math\RoundingMode;
|
||||
use Brick\Money\Context\AutoContext;
|
||||
use Brick\Money\Context\CustomContext;
|
||||
use DateTime;
|
||||
use GuzzleHttp\Exception\RequestException;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use Brick\Money\CurrencyConverter;
|
||||
use Brick\Money\ExchangeRateProvider\BaseCurrencyProvider;
|
||||
use Brick\Money\ExchangeRateProvider\PDOProvider;
|
||||
use Brick\Money\ExchangeRateProvider\PDOProviderConfiguration;
|
||||
use Brick\Money\ExchangeRateProvider\BaseCurrencyProvider;
|
||||
use Brick\Money\Money;
|
||||
use Brick\Math\RoundingMode;
|
||||
use PDO;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Psr\Http\Message\ResponseInterface;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use PDO;
|
||||
|
||||
trait Helper
|
||||
{
|
||||
|
@ -92,17 +99,20 @@ trait Helper
|
|||
return $hash;
|
||||
}
|
||||
|
||||
public function getCountryName($id_country){
|
||||
public function getCountryName($id_country)
|
||||
{
|
||||
return Country::findOrFail($id_country)->name;
|
||||
}
|
||||
|
||||
public function getNetworkName($id_network){
|
||||
public function getNetworkName($id_network)
|
||||
{
|
||||
return Network::findOrFail($id_network)->name;
|
||||
}
|
||||
|
||||
public function toMoneyWithNetwork($amount , $id_network){
|
||||
public function toMoneyWithNetwork($amount, $id_network)
|
||||
{
|
||||
$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();
|
||||
WHERE n.id = :id', ['id' => $id_network]))->first();
|
||||
|
||||
$money = Money::of(round($amount, 2), $currency ? $currency->code : 'XAF', new AutoContext());
|
||||
return $money->formatTo('fr_FR');
|
||||
|
@ -146,24 +156,27 @@ trait Helper
|
|||
$converter = new CurrencyConverter($provider);
|
||||
$init_country = Country::findOrFail($init_country);
|
||||
$final_country = Country::findOrFail($final_country);
|
||||
$init_money = Money::of(round($amount, 2),$init_country->currency->code,new AutoContext());
|
||||
$init_money = Money::of(round($amount, 2), $init_country->currency->code, new AutoContext());
|
||||
return $converter->convert($init_money, $final_country->currency->code, RoundingMode::DOWN);
|
||||
}
|
||||
|
||||
public function toMoneyWithCurrency($amount , $init_country , $final_country){
|
||||
return $this->convertMoney($amount , $init_country , $final_country)->formatTo('fr_FR');
|
||||
public function toMoneyWithCurrency($amount, $init_country, $final_country)
|
||||
{
|
||||
return $this->convertMoney($amount, $init_country, $final_country)->formatTo('fr_FR');
|
||||
}
|
||||
|
||||
public function toMoneyAmount($amount , $init_country , $final_country){
|
||||
return $this->convertMoney($amount , $init_country , $final_country)->getAmount()->toFloat();
|
||||
public function toMoneyAmount($amount, $init_country, $final_country)
|
||||
{
|
||||
return $this->convertMoney($amount, $init_country, $final_country)->getAmount()->toFloat();
|
||||
}
|
||||
|
||||
public function toUSDAmount($amount , $init_country , $final_currency_code = 'USD'){
|
||||
public function toUSDAmount($amount, $init_country, $final_currency_code = 'USD')
|
||||
{
|
||||
// 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();
|
||||
|
||||
|
@ -181,7 +194,7 @@ trait Helper
|
|||
// this currency converter can now handle any currency pair
|
||||
$converter = new CurrencyConverter($provider);
|
||||
$init_country = Country::findOrFail($init_country);
|
||||
$init_money = Money::of(round($amount, 2),$init_country->currency->code,new AutoContext());
|
||||
$init_money = Money::of(round($amount, 2), $init_country->currency->code, new AutoContext());
|
||||
return $converter->convert($init_money, $final_currency_code, RoundingMode::DOWN)->getAmount()->toFloat();
|
||||
}
|
||||
|
||||
|
@ -192,7 +205,8 @@ trait Helper
|
|||
// return str_replace(' ' ,'.',$first);
|
||||
// }
|
||||
|
||||
public function getCurrency($id_country){
|
||||
public function getCurrency($id_country)
|
||||
{
|
||||
$cc = CountriesCurrency::findOrFail($id_country);
|
||||
return $cc->currency_code;
|
||||
}
|
||||
|
@ -251,4 +265,119 @@ trait Helper
|
|||
}
|
||||
return $randomString;
|
||||
}
|
||||
|
||||
public function refundAllNanoCredit()
|
||||
{
|
||||
\Log::info('cron refund credit --');
|
||||
|
||||
$credits = UsersDemandesCredit::where('etat', 'VALIDE')->where('date_remboursement_prevu', '<=', Carbon::today())->get();
|
||||
foreach ($credits as $demande_credit) {
|
||||
\Log::info('Init credit ' . $demande_credit->id_demande);
|
||||
|
||||
// $refundDate = $demande_credit->date_remboursement_prevu;
|
||||
// //Compare la date de remboursement prevu à celle d'aujourd'hui
|
||||
// $today = (new DateTime())->format('Y-m-d');
|
||||
// $expiry = (new DateTime($refundDate))->format('Y-m-d');
|
||||
//
|
||||
// if(isset($refundDate) && (strtotime($today) >= strtotime($expiry))){
|
||||
//Reprise de la methode de remboursement
|
||||
|
||||
$user = User::findOrFail($demande_credit->id_user);
|
||||
$walletUser = WalletsUser::where('idUser', $demande_credit->id_user)->firstOrFail();
|
||||
|
||||
$this->refundNanoCredit($demande_credit, $user, $walletUser);
|
||||
\Log::info('Nano credit refunded ' . $demande_credit->id_demande);
|
||||
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
public function refundNanoCredit(UsersDemandesCredit $demande_credit, User $user, WalletsUser $walletUser)
|
||||
{
|
||||
|
||||
$init_country = $user->network->country->id;
|
||||
|
||||
$montantDejaRembourse = $demande_credit->montant_rembourse;
|
||||
$montantCreditRestant = $user->balance_credit;
|
||||
|
||||
$montantARembourser = ($montantCreditRestant > $walletUser->balance) ? $walletUser->balance : $montantCreditRestant;
|
||||
|
||||
$quota = $montantARembourser / ($montantDejaRembourse + $montantCreditRestant);
|
||||
|
||||
|
||||
if ($quota == 0) {
|
||||
// Solde egale zero donc pas de remboursement
|
||||
$this->sendMail($user->email, trans('messages.failed_nano_credit_refunded'), trans('messages.reload_your_account'));
|
||||
} else {
|
||||
$partialRefund = false;
|
||||
|
||||
$user->balance_credit -= $montantARembourser;
|
||||
$walletUser->balance -= $montantARembourser;
|
||||
$demande_credit->montant_rembourse += $montantARembourser;
|
||||
|
||||
$resteARembourser = $user->balance_credit;
|
||||
if ($resteARembourser == 0)
|
||||
$demande_credit->etat = 'REMBOURSE';
|
||||
else {
|
||||
$partialRefund = true;
|
||||
$demande_credit->partiellement_rembourse = true;
|
||||
}
|
||||
|
||||
if ($demande_credit->type_caution == 'individuel') {
|
||||
// Repartition des interet entre agents
|
||||
|
||||
$walletAgent = Wallet::findOrFail($demande_credit->id_wallet_agent);
|
||||
$network_agent = NetworksAgent::findOrFail($walletAgent->id_networkAgent);
|
||||
|
||||
$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);
|
||||
|
||||
$walletAgent->balance_com += floatval($demande_credit->interet * $quota * $config->taux_com_ag_nano_credit / 100);
|
||||
$walletSuperviseur->balance_com += floatval($demande_credit->interet * $quota * $config->taux_com_sup_nano_credit / 100);
|
||||
$walletHyperviseur->balance_com += floatval($demande_credit->interet * $quota * $config->taux_com_hyp_nano_credit / 100);
|
||||
|
||||
$walletAgent->save();
|
||||
$walletSuperviseur->save();
|
||||
$walletHyperviseur->save();
|
||||
}
|
||||
|
||||
if ($demande_credit->type_caution == 'groupe') {
|
||||
// Recuperation des wallets hyperviseur et superviseur
|
||||
$group = InfosUsersGroup::findOrFail($user->group_id);
|
||||
|
||||
$walletHyper = WalletAgent::where('category', 'hyper')->where('network_id', $group->id_network)->firstOrFail();
|
||||
$walletHyper = Wallet::findOrFail($walletHyper->wallet_id);
|
||||
|
||||
$walletHyper->balance_princ += $montantARembourser * $quota;
|
||||
$walletHyper->balance_com += $demande_credit->interet * $quota;
|
||||
$walletHyper->save();
|
||||
}
|
||||
|
||||
$demande_credit->date_remboursement = new \DateTime();
|
||||
$demande_credit->montant = $resteARembourser;
|
||||
|
||||
$walletUser->save();
|
||||
$user->save();
|
||||
$demande_credit->save();
|
||||
|
||||
$message = trans('messages.successful_nano_credit_demand_refunded',
|
||||
['id_demand' => $demande_credit->id_demande, 'amount' => $this->toMoney($montantARembourser, $init_country), 'duration' => $demande_credit->duree_mois,
|
||||
'net' => $this->toMoney($montantARembourser * $quota, $init_country), 'fees' => $this->toMoney($demande_credit->interet * $quota, $init_country),
|
||||
'tax' => $this->toMoney($demande_credit->taxe * $quota, $init_country),
|
||||
'caution' => $demande_credit->type_caution == 'groupe' ? 'Groupe' : 'Individuel']);
|
||||
|
||||
$this->sendMail($user->email, (!$partialRefund) ? trans('messages.successful_nano_credit_refunded') :
|
||||
trans('messages.successful_nano_credit_partially_refunded'), $message);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -58,5 +58,9 @@ Paying network : :network :country',
|
|||
"savings_already_broken" => "Savings already broken",
|
||||
"group_not_allow_to_borrow" => "The group is not allowed to borrow",
|
||||
"borrowing_capacity_exceeded" => "The borrowing capacity is exceeded",
|
||||
"savings_not_found" => "This savings does not exist"
|
||||
"savings_not_found" => "This savings does not exist",
|
||||
"regulations_limits_amount_transaction" => "You can make a transaction of :amount .",
|
||||
"daily_regulations_limits_reached" => "You have reached your daily limit.",
|
||||
"weekly_regulations_limits_reached" => "You have reached your weekly limit.",
|
||||
"monthly_regulations_limits_reached" => "You have reached your monthly limit.",
|
||||
];
|
||||
|
|
|
@ -209,6 +209,7 @@ Request Information:
|
|||
NB: The reimbursement process is automatic on the due date if the reimbursement is not initiated",
|
||||
'successful_guarantee_nano_credit_demand' => 'Guaranteed nanocredit request',
|
||||
'successful_nano_credit_refunded' => 'Nano credit repayment made',
|
||||
'successful_nano_credit_partially_refunded' => 'Partially completed nano credit automatic repayment',
|
||||
'successful_nano_credit_demand_refunded' => "Nano credit refunded
|
||||
Request Information:
|
||||
- Request number: :id_demand
|
||||
|
@ -242,4 +243,5 @@ Savings Information :
|
|||
- Taxes : :tax
|
||||
- Net amount saved : :net",
|
||||
"successful_broken_saving" => "Broken savings",
|
||||
"reload_your_account" => "Reload your account",
|
||||
];
|
||||
|
|
|
@ -58,5 +58,9 @@ Réseau payeur : :network :country',
|
|||
"savings_already_broken" => "Épargne déjà cassée",
|
||||
"group_not_allow_to_borrow" => "Le groupe n'a pas le droit d'emprunter",
|
||||
"borrowing_capacity_exceeded" => "La capacité d'emprunt est dépassée",
|
||||
"savings_not_found" => "Cette épargne n'existe pas"
|
||||
"savings_not_found" => "Cette épargne n'existe pas",
|
||||
"regulations_limits_amount_transaction" => "Vous pouvez effectuer une transaction de :amount .",
|
||||
"daily_regulations_limits_reached" => "Vous avez atteint votre limite journalière.",
|
||||
"weekly_regulations_limits_reached" => "Vous avez atteint votre limite hebdomadaire.",
|
||||
"monthly_regulations_limits_reached" => "Vous avez atteint votre limite mensuelle.",
|
||||
];
|
||||
|
|
|
@ -200,7 +200,7 @@ Informations de la demande :
|
|||
- Montant du crédit : :amount
|
||||
- Intérêts : :fees
|
||||
- Taxes : :tax
|
||||
- Montant net à percu : :net
|
||||
- Montant net à percevoir : :net
|
||||
- Duréé (en mois) : :duration
|
||||
- Date de remboursement : :date
|
||||
- Noms du client : :user_name
|
||||
|
@ -209,6 +209,8 @@ Informations de la demande :
|
|||
NB: Le processus de remboursement est automatique à la date d'échéance si le remboursement n'est pas initié",
|
||||
'successful_guarantee_nano_credit_demand' => 'Demande de nano crédit cautionnée',
|
||||
'successful_nano_credit_refunded' => 'Remboursement de nano crédit effectué',
|
||||
'successful_nano_credit_partially_refunded' => 'Remboursement automatique de nano crédit partiellement effectué',
|
||||
'failed_nano_credit_refunded' => 'Remboursement automatique de nano crédit échoué',
|
||||
'successful_nano_credit_demand_refunded' => "Nano crédit remboursé
|
||||
Informations de la demande :
|
||||
- Numéro de la demande : :id_demand
|
||||
|
@ -244,4 +246,5 @@ Informations sur l'epargne :
|
|||
- Montant net epargné : :net
|
||||
",
|
||||
"successful_broken_saving" => "Epargne cassée",
|
||||
"reload_your_account" => "Rechargez votre compte",
|
||||
];
|
||||
|
|
Loading…
Reference in New Issue