walletservice/app/Http/Controllers/HelperController.php

345 lines
14 KiB
PHP
Executable File

<?php
namespace App\Http\Controllers;
use App\Exports\RefundAmountExport;
use App\Jobs\TestJob;
use App\Models\AgentPlus;
use App\Models\ConfigWallet;
use App\Models\Country;
use App\Models\NetworksAgent;
use App\Models\User;
use App\Models\Wallet;
use App\Models\WalletAgent;
use App\Models\WalletsUser;
use App\Models\WalletTransaction;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Maatwebsite\Excel\Facades\Excel;
class HelperController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
//
}
public function countries()
{
$countries = DB::select('SELECT id , name , code_dial , code_country FROM countries_currencies WHERE id IN (
SELECT distinct c.id FROM networks n INNER JOIN countries_currencies c ON n.country_id=c.id INNER JOIN configWallet cw ON cw.id_network = n.id WHERE status = 1
);');
return $this->successResponse($countries);
}
public function paying_networks(Request $request)
{
$this->validate($request,[
'id_country' => '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',
]);
if (isset($request->id_wallet_agent)) {
$walletAgent = Wallet::findOrFail($request->get('id_wallet_agent'));
$network_agent = NetworksAgent::findOrFail($walletAgent->id_networkAgent);
$init_country = $network_agent->network->country->id;
// Configuratrion du wallet
$config = ConfigWallet::where('id_network', $network_agent->network_id)->firstOrFail();
} elseif (isset($request->id_wallet_user)) {
$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'));
}
}
$networks = DB::select('SELECT n.id , n.name , c.type FROM networks n INNER JOIN configWallet c ON c.id_network = n.id WHERE n.id
IN ( SELECT distinct id_network FROM paying_networks WHERE id_configWallet = :id_config)
AND status = 1 AND country_id = :id_country;',['id_country'=>$request->id_country, 'id_config'=> $config->id]);
foreach ($networks as $network){
if($network->type == 'ilink')
$network->type = 'ilink-world';
}
if($request->id_country == $init_country ){
$currentNetwork = new \stdClass();
$currentNetwork->id = $config->network->id;
$currentNetwork->name = $config->network->name;
$currentNetwork->type = 'ilink-world';
array_unshift($networks,$currentNetwork);
}
return $this->successResponse($networks);
}
public function other_paying_networks(Request $request)
{
$this->validate($request,[
'id_country' => 'required|integer|min:0|not_in:0',
'id_wallet_agent' => 'required|integer|min:0|not_in:0',
]);
$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();
$networks = DB::select('SELECT n.id , n.name , c.type FROM networks n INNER JOIN configWallet c ON c.id_network = n.id WHERE n.id
IN ( SELECT distinct id_network FROM paying_networks WHERE id_configWallet = :id_config)
AND status = 1 AND c.type <> \'ilink\' AND country_id = :id_country;',['id_country'=>$request->id_country, 'id_config'=> $config->id]);
return $this->successResponse($networks);
}
public function country($code_dial){
return $this->successResponse(Country::where('code_dial',$code_dial)->firstOrFail());
}
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);
$user->user_code = $user_code;
$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 ! ');
}
private function generateUserCode($length = 10)
{
$characters = '23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
// Retourne tous les codes membres d'un agent à partir d'un code
public function agentCodes($agent_code)
{
$agent = AgentPlus::where('code_membre', $agent_code)->first();
$codes = [];
if ($agent) {
$codes = DB::select("SELECT cg.code_membre as code_membre from networks_agents na INNER JOIN codeGenerer cg
ON cg.id=na.codeGenerer_id INNER JOIN networks ne ON ne.id=na.network_id WHERE na.agent_id = :id", ['id' => $agent->id]);
}
return $this->successResponse($codes);
}
public function calculateTransactionAmount()
{
$data = [['ID Wallet', 'Agent', 'Contact', 'Role', 'Parrain', 'Nombre de transactions', 'Montant à rembourser']];
// Calcul du montant a prelever pour tous les agents loc du reseau iLink World
$config = ConfigWallet::where('id_network', 237)->first();
if (isset($config)) {
$walletAgents = WalletAgent::where('network_id', 237)->orderBy('category')->orderBy('lastname', 'ASC')->get();
foreach ($walletAgents as $wallet) {
$refund = 0;
$totalTransactions = 0;
if ($wallet->category == 'geolocated') {
$totalTransactions = WalletTransaction::where('id_wallet', $wallet->wallet_id)->where('type', 'credit')
->where('canceled', '0')->where('deleted', 0)->count();
// Montant à rembourser
$refund = $totalTransactions * $config->frais_min_banque_depot * $config->taux_com_ag_depot / 100;
} elseif ($wallet->category == 'super') {
$totalTransactions = WalletTransaction::where('id_wallet_sup', $wallet->wallet_id)->where('type', 'credit')
->where('canceled', '0')->where('deleted', 0)->count();
// Montant à rembourser
$refund = $totalTransactions * $config->frais_min_banque_depot * $config->taux_com_sup_depot / 100;
} elseif ($wallet->category == 'hyper') {
$totalTransactions = WalletTransaction::where('id_wallet_hyp', $wallet->wallet_id)->where('type', 'credit')
->where('canceled', '0')->where('deleted', 0)->count();
// Montant à rembourser
$refund = $totalTransactions * $config->frais_min_banque_depot * (100 - $config->taux_com_ag_depot - $config->taux_com_sup_depot) / 100;
}
array_push($data, [$wallet->wallet_id, $wallet->lastname, substr($wallet->transactionNumber, 4), $wallet->category, $wallet->parrain,
$totalTransactions, $refund]);
}
}
$export = new RefundAmountExport($data);
return Excel::download($export, 'refund.xlsx');
}
// public function fixFSServicesAmounts()
// {
// $data = Excel::toArray(new RefundAmountImport, storage_path('refund.xlsx'));
// $result = [];
// foreach ($data[0] as $key => $row) {
// if ($key > 0) {
// array_push($result, $row);
// }
// }
//
// try {
// DB::beginTransaction();
// // Fix amount
// foreach ($result as $r) {
// if (isset($r[6])) {
// if ($r[3] == 'hyper') continue;
// $refund = $r[3] == 'geolocated' ? 50 * $r[5] : 25 * $r[5];
// $wallet = Wallet::find($r[0]);
// $wallet->balance_com += $refund;
// $wallet->save();
// }
// }
// DB::commit();
// return $this->successResponse(trans('messages.success_treated_demand'));
// } catch (Throwable $exception) {
// DB::rollBack();
// Log::error($exception->getMessage());
// return $this->errorResponse(trans('errors.unexpected_error'));
// }
// }
public function notifyNewUser(Request $request)
{
// Notifier le nouvel agent inscrit
$this->validate($request, [
'subject' => 'required|string',
'email' => 'required|string',
'category' => 'required_if:user_type,agent|string',
'message' => 'required|string',
'user_id' => 'required|integer',
'user_type' => 'required|in:user,agent'
]);
$subject = $request->input('subject');
$email = $request->input('email');
$message = $request->input('message');
$category = $request->input('category');
$user_id = $request->input('user_id');
$user_type = $request->input('user_type');
try {
//Check if the directory already exists.
$qr_code_pdf = null;
if (empty($category) || $category == 'geolocated') {
$qr_code_pdf = $this->generateQRCode($user_id, $user_type);
}
$recipients = [preg_replace("/\s+/", "", $email)]; // Supprimer les espaces dans le mail
Mail::mailer('smtp')->raw($message, function ($message) use ($recipients, $subject, $qr_code_pdf) {
$message->subject($subject)
->to($recipients);
if (!empty($qr_code_pdf)) {
$message->attachData($qr_code_pdf->output(), 'qr_code.pdf');
}
});
} catch (\Throwable $t) {
Log::error('-------- Mail not sent -----------');
Log::error($t->getMessage() . " :\n" . $t->getTraceAsString());
}
}
/**
* @OA\Post(
* path="/agents",
* summary="Rechercher un agent",
* tags={"Agents"},
* security={{"api_key":{}}},
* @OA\RequestBody(
* description="Corps de la requete",
* required=true,
* @OA\MediaType(
* mediaType="application/json",
* @OA\Schema(
* @OA\Property(property="dial_code",
* type="string",
* description="Dial code du pays",
* example= "+237",
* ),
* @OA\Property(property="name",
* type="string",
* example="tom",
* description="Nom de l'agent"
* ),
* @OA\Property(property="phone",
* type="string",
* example="0452366562",
* description="Numero de telephone"
* ),
* @OA\Property(property="id",
* type="integer",
* example = 12,
* description="ID de l'agent"
* )
* )
* )
* ),
* @OA\Response(
* response=200,
* description="OK",
* @OA\JsonContent(
* ref="#/components/schemas/ApiResponse",
* example = {
* "status" : 200,
* "response" : "Votre requête de rattachement de votre compte bancaire a été prise en compte, vous recevrez un mail de confirmation dès lors que la banque aura validé votre code IBAN",
* "error":null
* }
* )
* )
* )
*/
// Option de recherche des agents geolocalisés
public function getAgents(Request $request)
{
$this->validate($request, [
'name' => 'string',
'phone' => 'string',
'id' => 'integer',
'dial_code' => 'required|string|min:2'
]);
$name = $request->input('name');
$phone = $request->input('phone');
$id = $request->input('id');
$dial_code = $request->input('dial_code');
$perPage = current(DB::select("SELECT valeur_int FROM adminConfig WHERE cle = 'pas_chargement' LIMIT 1"))->valeur_int ?? 10;
$query = AgentPlus::where('category', 'geolocated')->where('code_dial', $dial_code)->where('etat', 1)->distinct();
if (!empty($name)) {
$query = $query->where('lastname', 'like', '%' . $name . '%')->orWhere('firstname', 'like', '%' . $name . '%');
}
if (!empty($phone)) {
$query = $query->where('phone', 'like', '%' . $phone . '%')->orWhere('transactionNumber', 'like', '%' . $phone . '%');
}
if (!empty($id)) {
$query = $query->where('id', $id);
}
$agents = $query->selectRaw('id , firstname, lastname, adresse , email , longitude , latitude , phone , transactionNumber , openHours , closeHours , solde , network, country')->paginate($perPage);
return $this->successResponse($agents);
}
}