<?php
namespace App\Http\Controllers;
use App\AmountGenerate;
use App\Bank\MasterAccount;
use App\Bank\Payment;
use App\Classes\GenerateToken;
use App\Classes\CurrentPassword;
use App\Classes\Kyc;
use App\Classes\AuthPIN;
use App\Classes\Record;
use App\Classes\SendSMS;
use App\Classes\SmsManager;
use App\Classes\TransactionGeneration;
use App\Credelec;
use App\Imali\BankConection;
use App\Imali\ImaliAccount;
use App\Imali\RechargeImaliAccount;
use App\PhoneValidation;
use App\PurchaseVoucher;
use App\ReverteImaliAccount;
use App\SendMoneyB2B;
use App\SendMoneyImaliMpesa;
use App\TransferHistory;
use App\User;
use App\Wallet;
use App\WalletFee;
use App\Water;
use App\WithDrawall;
use App\WithdrawalsRequest;
use Illuminate\Http\Request;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Hash;
use Webpatser\Uuid\Uuid;
use Paymentsds\MPesa\Client;
use Illuminate\Support\Facades\Storage;
use URL;
use File;
use App\AccountDeletionReason;
use App\AccountDeletionRequest;
use App\Classes\Auth;
use App\Classes\GenerateImaliAccount;
use App\Classes\PushNotification;
use App\Classes\SendResponse;
use App\Classes\UserKyc;
use App\Operator;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Session;
use App\Imali\BusinessAccount;
use App\Imali\Transfer;
use App\ImaliSubAccount;
use App\EmailValidation;
use App\Mail\ResetPinEmail;
use App\Store;
use App\SubAccountDeletionRequest;
use App\SubAccountType;
use App\TransactionHistory;
use App\UserRechargPhone;
use Exception;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Log;
use Illuminate\Validation\ValidationException;
class UserController extends Controller
{
protected SmsManager $smsManager;
public function __construct()
{
$this->smsManager = new SmsManager();
$this->baseUrl = URL::to("/") . '/images/avatar/';
$this->storagePath = public_path() . '/images/avatar';
}
public function getAccountDeletionRequests()
{
$deletionRequests = AccountDeletionRequest::query()
->join('account_deletion_reasons', 'account_deletion_reasons.id', 'account _deletion_requests.account_deletion_reason_id')
->join('imali_accounts', 'imali_accounts.account_number', 'account _deletion_requests.account_number')
->join('users', 'users.id', 'imali_accounts.user_id')
->select('users.name', 'account _deletion_requests.*', 'account_deletion_reasons.reason')
->orderBy('account _deletion_requests.id', 'desc')->limit(10)->get();
return response()->json(['data' => $deletionRequests]);
}
public function getAccountDeletionReasons()
{
$reasons = AccountDeletionReason::get();
return response()->json(['data' => $reasons]);
}
public function makeAccountDeletionRequest(Request $request)
{
$this->validate($request, [
'account_number' => 'required',
'account_deletion_reason_id' => 'required',
'pin' => 'required',
], [
'account_number.required' => 'Campo account_number obrigatório',
'pin.required' => 'Campo pin obrigatório',
'account_deletion_reason_id' => 'Campo account_deletion_reason_id obrigatório!',
]);
$imaliAccount = ImaliAccount::query()->where('account_number', $request->account_number)->first();
$user = User::query()->where('id', $imaliAccount->user_id)->first();
if (!$imaliAccount) return response()->json(['message' => 'Conta imali inválida!'], 400);
//Verificando se a conta que esta fazendo o pedido é a mesma que esta loggada
if ($request->account_number != $request->user()->imaliAccount->account_number) return response()->json(['message' => 'Conta imali inválida!'], 400);
//Validar PIN
if (!AuthPIN::validatePIN($request->user()->id, $request->pin, $request->user()->pin)) return response()->json(['message' => 'PIN incorrecto!'], 400);
// a conta não pode ser cancelada com saldo
if ($imaliAccount->balance > 0) return response()->json(['message' => 'Não é possível cancelar a tua conta imali, pois ainda tem saldo disponível.'], 400);
if ($imaliAccount->captive_balance > 0) return response()->json(['message' => 'Não é possível cancelar a tua conta imali, pois tens transaçõs por serem concluídas.'], 400);
$imaliaccount_has_adr = AccountDeletionRequest::query()->where('account_number', $request->account_number)->first();
if ($imaliaccount_has_adr) return response()->json(['message' => 'Esta conta ' . $request->account_number . ', já efectuou um pedido de cancelamento de conta.'], 400);
if ($request->account_deletion_reason_id == 8) {
$this->validate($request, [
'commentary_reason' => 'required|min:15',
], [
'commentary_reason.required' => 'Campo commentary_reason obrigatório',
'commentary_reason.required' => 'Campo commentary_reason tem que ter no mínimo 15 caracteres',
]);
}
AccountDeletionRequest::create([
'account_number' => $request->account_number,
'account_deletion_reason_id' => $request->account_deletion_reason_id,
'commentary_reason' => $request->commentary_reason,
]);
$user->status = 0;
$user->is_online = 0;
$user->update();
return response()->json(['message' => 'Pedido de encerramento de conta foi enviado com sucesso!'], 200);
}
// todo ---- 2024
public function makeAccountDeletionRequest2024(Request $request)
{
$this->validate($request, [
'account_number' => 'required',
'account_deletion_reason_id' => 'required',
'pin' => 'required',
], [
'account_number.required' => 'Campo account_number obrigatório',
'pin.required' => 'Campo pin obrigatório',
'account_deletion_reason_id' => 'Campo account_deletion_reason_id obrigatório!',
]);
// Buscar dados do User que faz a transacao
// $userSender = User::getUserDetails(auth()->user()->id);
// Buscar dados da conta do User que faz a transacao
// $imaliAccount = User::getAccountByUser($userSender->id, $userSender->account_id);
$imaliAccount = ImaliAccount::query()
->join('users', 'users.id', 'imali_accounts.user_id')
->where('account_number', $request->account_number)
->select('users.*', 'imali_accounts.*')
->first();
$user = User::query()->where('id', $imaliAccount->user_id)->first();
if (!$imaliAccount) return response()->json(['message' => 'Conta imali inválida!'], 400);
//Verificando se a conta que esta fazendo o pedido é a mesma que esta loggada
if ($request->account_number != $imaliAccount->account_number) return response()->json(['message' => 'Conta imali inválida!'], 400);
//Validar PIN
if (!AuthPIN::validatePIN($imaliAccount->id, $request->pin, $imaliAccount->pin)) return response()->json(['message' => 'PIN incorrecto!'], 400);
// a conta não pode ser cancelada com saldo
if ($imaliAccount->balance > 0) return response()->json(['message' => 'Não é possível cancelar a tua conta imali, pois ainda tem saldo disponível.'], 400);
if ($imaliAccount->captive_balance > 0) return response()->json(['message' => 'Não é possível cancelar a tua conta imali, pois tens transaçõs por serem concluídas.'], 400);
$imaliaccount_has_adr = AccountDeletionRequest::query()->where('account_number', $request->account_number)->first();
if ($imaliaccount_has_adr) return response()->json(['message' => 'Esta conta ' . $request->account_number . ', já efectuou um pedido de cancelamento de conta.'], 400);
if ($request->account_deletion_reason_id == 8) {
$this->validate($request, [
'commentary_reason' => 'required|min:15',
], [
'commentary_reason.required' => 'Campo commentary_reason obrigatório',
'commentary_reason.required' => 'Campo commentary_reason tem que ter no mínimo 15 caracteres',
]);
}
AccountDeletionRequest::create([
'account_number' => $request->account_number,
'account_deletion_reason_id' => $request->account_deletion_reason_id,
'commentary_reason' => $request->commentary_reason,
]);
$user->status = 0;
$user->is_online = 0;
$user->update();
// return response()->json(['message' => 'Pedido de encerramento de conta foi enviado com sucesso!'], 200);
// Redirecione para a página de sucesso ou qualquer outra página desejada
$message = "Pedido de encerramento de conta foi enviado com sucesso!";
if ($request->wantsJson()) {
// return JSON-formatted response
return response()->json(['message' => $message], 200);
} else {
// return HTML response
// return view('email-not-sent', compact('message'));
// $message = "O seu PIN foi redefinido com sucesso";
return view('email-sent', compact('message'));
}
// if ($user) {
// return response()->json(['error' => false, 'status_code' => 200, 'message' => "Pedido de encerramento de conta foi enviado com sucesso!"], 200);
// } else {
// return response()->json(['error' => true, 'status_code' => 500, 'message' => "Houve um erro a inserir os dados"], 200);
// }
}
//? Aceitar pedido de cancelamento de conta
public function acceptAccountDeletionRequest(Request $request)
{
$this->validate(
$request,
[
'account_deletion_request_id' => 'required',
'account_number' => 'required'
],
[
'account_deletion_request_id.required' => 'Campo account_deletion_request_id obrigatorio',
'account_number.required' => 'Campo account_number obrigatorio'
]
);
$accountDeletionRequest = AccountDeletionRequest::query()->where('id', $request->account_deletion_request_id)
->where('account_number', $request->account_number)->where('status', 'pending')->first();
if (!$accountDeletionRequest) return response()->json(['message' => 'Este pedido de cancelamento de conta nao existe'], 404);
$imaliAccount = ImaliAccount::query()->where('account_number', $request->account_number)->first();
if (!$imaliAccount) return response()->json(['message' => 'Este numero de conta nao existe'], 404);
$user = User::query()->where('id', $imaliAccount->user_id)->first();
$phone_user = PhoneValidation::query()->where('phone', $user->phone)->first();
if ($phone_user) $phone_user->delete();
// $token = new GenerateToken;
// $codetoken = $token->generatePhoneNumberCode();
$user->status = 0;
$user->is_online = 0;
// $user->phone = 'iMaliPhone'.$codetoken;
// $user->email = 'iMaliEmail'.$codetoken;
$user->update();
$user->delete();
$accountDeletionRequest->status = 'completed';
$accountDeletionRequest->update();
return response()->json(['message' => 'O pedido de cancelamento de conta foi feito com sucesso'], 200);
}
//? Cancelar o pedido de remocao da conta
public function cancelAccountDeletionRequest(Request $request)
{
$this->validate(
$request,
[
'account_deletion_request_id' => 'required',
'account_number' => 'required'
],
[
'account_deletion_request_id.required' => 'Campo account_deletion_request_id obrigatorio',
'account_number.required' => 'Campo account_number obrigatorio'
]
);
$accountDeletionRequest = AccountDeletionRequest::query()->where('id', $request->account_deletion_request_id)
->where('account_number', $request->account_number)->where('status', 'pending')->first();
if (!$accountDeletionRequest) return response()->json(['message' => 'Este pedido de cancelamento de conta nao existe'], 404);
$imaliAccount = ImaliAccount::query()->where('account_number', $request->account_number)->first();
if (!$imaliAccount) return response()->json(['message' => 'Este numero de conta nao existe'], 404);
$user = User::query()->where('id', $imaliAccount->user_id)->first();
$user->status = 1;
$user->update();
$accountDeletionRequest->status = 'canceled';
$accountDeletionRequest->update();
return response()->json(['message' => 'O pedido de cancelado com sucesso'], 200);
}
//? Bloquear conta iMali
public function blockOrEnableIMaliAccount(Request $request)
{
$this->validate(
$request,
[
'account_number' => 'required'
],
[
'account_number.required' => 'Campo account_number obrigatorio'
]
);
$imaliAccount = ImaliAccount::query()->where('account_number', $request->account_number)->first();
if (!$imaliAccount) return response()->json(['message' => 'Este numero de conta nao existe'], 404);
$user = User::query()->where('id', $imaliAccount->user_id)->first();
if (!$user) return response()->json(['message' => 'Esta conta nao existe'], 404);
$user->status = $user->status ? 0 : 1;
$user->update();
return response()->json(['message' => 'Conta ' . $user->status ? 'desactivada' : 'activada' . ' com sucesso'], 200);
}
public function hideAndShowBalance(Request $request)
{
$user = User::find($request->user()->id);
if ($user) {
if ($user->balance_visibility == false) {
$user->update(['balance_visibility' => true]);
return response()->json(['message' => 'Actualizado com Sucesso para Verdadeiro'], 200);
} else {
$user->update(['balance_visibility' => false]);
return response()->json(['message' => 'Actualizado com Sucesso para Falso'], 200);
}
} else {
return response()->json(['message' => 'Utilizador não encontrado'], 400);
}
}
public function validatePin(Request $request)
{
$this->validate($request, [
'pin' => 'required|min:4'
]);
if (Hash::check($request->pin, $request->user()->pin)) {
return response()->json(['message' => 'ok'], 200);
} else {
return response()->json(['message' => 'Pin Incorrecto'], 405);
}
}
public function getMyMonthConsuming(Request $request)
{
$currentMonth = date('m');
// $data = DB::table("items")
// ->whereRaw('MONTH(created_at) = ?',[$currentMonth])
// ->get();
// $data = Item::select('*')
// ->whereMonth('created_at', Carbon::now()->month)
// ->get();
$voucher = PurchaseVoucher::query()
->whereRaw('MONTH(created_at) = ?', [$currentMonth])
->where('user_id', $request->user()->id)
->sum('price');
$transfer = TransferHistory::query()
->whereRaw('MONTH(created_at) = ?', [$currentMonth])
->where('user_id', $request->user()->id)
->where('user_status', 'payer')
->sum('amount');
$payments = Payment::query()
->whereRaw('MONTH(created_at) = ?', [$currentMonth])
->where('sender_id', $request->user()->id)
->sum('amount');
$credelec = Credelec::query()
->whereRaw('MONTH(created_at) = ?', [$currentMonth])
->where('user_id', $request->user()->id)
->sum('amount');
$water = Water::query()
->whereRaw('MONTH(created_at) = ?', [$currentMonth])
->where('user_id', $request->user()->id)
->sum('purchaseValue');
return response()->json(['water' => $water, 'voucher' => $voucher, 'transfer' => $transfer, 'payments' => $payments, 'credelec' => $credelec]);
}
public function getUser()
{
// $user = User::query()
// ->join('imali_accounts', 'imali_accounts.user_id', '=', 'users.id')
// ->where('users.id', auth()->user()->id)
// ->select('users.*', 'imali_accounts.account_number', 'imali_accounts.balance', 'imali_accounts.points', 'imali_accounts.account_number', 'imali_accounts.reference')
// ->first();
//$user = ImaliAccount::query()
// ->join('users', 'imali_accounts.user_id', '=', 'users.id')
// ->join('imali_account_configs', 'imali_accounts.imali_account_config', '=', 'imali_account_configs.id')
// ->where('users.id', auth()->user()->id)
// ->select('users.*', 'imali_accounts.account_number', 'imali_accounts.balance', 'imali_accounts.points', 'imali_accounts.account_number', 'imali_accounts.reference', 'imali_account_configs.nr_transaction', 'imali_account_configs.max_value_operation', 'imali_account_configs.level')
// ->first();
// $user->makeHidden(['id', 'profile', 'password', 'pin', 'firebase_token', 'created_at', 'updated_at'
// , 'phone_reference', 'user_id', 'bi', 'document_id', 'remember_token', 'email_verified_at']);
$user = User::getUserAccount();
return response()->json($user);
}
public function getMyImaliAccount($id)
{
$imali = ImaliAccount::query()->where('user_id', $id)->first();
return response()->json($imali);
}
public function rechargeByReference(Request $request)
{
$imaliAccount = User::getAccount($request->reference);
$user = User::getUserDetails($imaliAccount->user_id);
// $imaliAccount = ImaliAccount::query()->where('reference', $request->reference)->first();
$transactionString = new TransactionGeneration();
// $user = ImaliAccount::query()->join('users', 'users.id', '=', 'imali_accounts.user_id')
// ->where('users.id', $imaliAccount->user_id)
// ->select('users.*', 'imali_accounts.account_number')
// ->first();
if ($user->profile === 'business') {
$kyckCheck = false;
} else {
$kyc = new Kyc();
$kyckCheck = $kyc->checkRecharge($request);
}
// Get User Authenticated
$auth_user = User::getUserAccount();
if ($kyckCheck) {
return $kyckCheck;
} else {
if ($imaliAccount) {
$balanceActual = $imaliAccount->balance + $request->amount;
$masterAccount = MasterAccount::find(2);
$recharge = RechargeImaliAccount::create([
'imali_account_id' => $imaliAccount->id,
'transaction_id' => $transactionString->generateTransaction(),
'description' => $request->description,
'amount' => $request->amount,
'last_balance' => $imaliAccount->balance,
'balance' => $balanceActual,
'account_reference' => $request->reference,
'recharge_way' => 'Agente i.Mali 0001',
'estado' => 'sucesso',
'estado_color' => '#388E3C',
'master_account_id' => $masterAccount->id,
'user_id' => $auth_user->id
]);
$masterBalance = $masterAccount->balance + $request->amount;
$masterAccount->update(['balance' => $masterBalance]);
if ($recharge) {
$imaliAccount->update(['balance' => $balanceActual]);
$notification = array(
'icon' => 'ic_imali_logo_verde_01',
// 'icon' => 'ic_i_mali_cover',
'title' => 'Carregamento ' . $recharge->amount . ' MT',
'body' => 'Parabéns, ' . 'carregaste ' . $recharge->amount . ' MT ' . ' na tua conta ' . $imaliAccount->account_number,
'click_action' => 'com.imali.payapp.payment_RECHARGE_DETAILS',
// 'color' => '#008577'
'color' => '#ffffff'
);
$data = array(
'transaction' => $recharge->transaction_id,
'name' => $user->name,
'description' => $request->description,
'amount' => (float)$recharge->amount,
'phone' => $user->phone,
'reference' => $imaliAccount->reference,
'data' => $recharge->created_at,
'estado' => $recharge->estado,
'route' => 'RECHARGE_DETAILS',
'recharge_way' => $recharge->recharge_way,
'account_number' => $user->account_number,
'terminal' => 'firebase'
);
$this->pushNotifification($user->firebase_token, $notification, $data);
//$this->smsManager->sendSMSForUserRecharge($recharge);
}
if ($recharge) {
// Mail::to($user->email)->send(new Carregamento($recharge));
}
$log = new Record();
$log->createLog([
'description' => $imaliAccount->account_number,
'details' => $user->name . ' ' . $user->last_name,
'operation' => 'Recharge by Reference',
'status' => 'success',
'user_id' => $request->user()->id
]);
if ($recharge) {
return response()->json(['message' => 'Carregamento, feito com Sucesso'], 200);
}
}
////////
}
}
public function rechargeByReference2(Request $request)
{
// return $request->all();
foreach ($request->contentData as $requestData) {
$imaliAccount = ImaliAccount::query()->where('reference', $requestData['payment_reference'])->first();
$transactionString = new TransactionGeneration();
if ($imaliAccount) {
$user = ImaliAccount::query()->join('users', 'users.id', '=', 'imali_accounts.user_id')
->where('users.id', $imaliAccount->user_id)
->select('users.*')
->first();
$balanceActual = $imaliAccount->balance + $requestData['paid_amount'];
$masterAccount = MasterAccount::find(2);
$recharge = RechargeImaliAccount::create([
'imali_account_id' => $imaliAccount->id,
'transaction_id' => $transactionString->generateTransaction(),
'amount' => $requestData['paid_amount'],
'bank_date' => $requestData['datetime_of_transaction'],
'account_reference' => $requestData['payment_reference'],
'last_balance' => $imaliAccount->balance,
'balance' => $balanceActual,
'recharge_way' => $requestData['terminal_locality'] ? $requestData['terminal_locality'] : 'SIMO REDE',
'estado' => 'sucesso',
'estado_color' => '#388E3C',
'master_account_id' => $masterAccount->id,
'content_id' => $requestData['content_id']
]);
$masterBalance = $masterAccount->balance + $requestData['paid_amount'];
$masterAccount->update(['balance' => $masterBalance]);
if ($recharge) {
$imaliAccount->update(['balance' => $balanceActual]);
$notification = array(
'icon' => 'ic_imali_logo_verde_01',
// 'icon' => 'ic_i_mali_cover',
'title' => 'Carregamento ' . $recharge->amount . ' MT',
'body' => 'Parabéns, ' . 'carregaste com ' . $recharge->amount . ' MT ' . ' na tua conta ' . $imaliAccount->account_number,
// 'click_action' => 'com.imali.payapp.payment_TRANSFER_DETAILS',
'click_action' => 'com.imali.payapp.payment_RECHARGE_DETAILS',
// 'color' => '#008577'
'color' => '#ffffff'
);
$data = array(
'transaction' => $recharge->transaction_id,
'name' => $user->name,
'amount' => (float)$recharge->amount,
'phone' => $user->phone,
'reference' => $imaliAccount->reference,
'data' => $recharge->created_at,
'estado' => $recharge->estado,
'route' => 'RECHARGE_DETAILS',
'recharge_way' => $recharge->recharge_way,
'terminal' => 'firebase'
);
$this->pushNotifification($user->firebase_token, $notification, $data);
$this->smsManager->sendSMSForUserRecharge($recharge);
}
// if ($recharge) {
//// Mail::to($user->email)->send(new Carregamento($recharge));
// }
// $log = new Record();
// $log->createLog([
// 'description' => $imaliAccount->account_number,
// 'details' => $user->name . ' ' . $user->last_name,
// 'operation' => 'Recharge by Reference',
// 'status' => 'success',
// 'user_id' => $request->user()->id
// ]);
if ($recharge) {
// return response()->json(['message' => 'Carregamento, feito com Sucesso'], 200);
}
} else {
// PendingRecharge::create([
// 'reference' => $requestData['payment_reference'],
// 'amount' => $requestData['paid_amount'],
// 'content_id' => $requestData['content_id']
// // 'content_id' => $request->content_id
// ]);
$recharge = RechargeImaliAccount::create([
'imali_account_id' => 0,
'transaction_id' => $transactionString->generateTransaction(),
'amount' => $requestData['paid_amount'],
'account_reference' => $requestData['payment_reference'],
'bank_date' => $requestData['datetime_of_transaction'],
'last_balance' => 0,
'balance' => 0,
'recharge_way' => $requestData['terminal_locality'],
'estado' => 'falhou',
'estado_color' => '#388E3C',
'master_account_id' => 0,
'content_id' => $requestData['content_id']
]);
// return response()->json(['message' => 'Referencia inválida'], 400);
}
// $kyc = new Kyc();
//// $kyckCheck = $kyc->checkRecharge($request);
// $kyckCheck = $kyc->checkRechargeByBank($requestData);
//
// if ($kyckCheck) {
// return $kyckCheck;
// } else {
//
//
// }
}
return response()->json(['message' => 'Carregamento, feito com Sucesso'], 200);
}
public function rechargeByReferenceNew25(Request $request)
{
$this->validate(
$request,
[
'reference' => 'required|exists:imali_accounts,reference|digits:11',
'amount' => 'required|numeric|min:10',
'recharge_way' => 'required|in:MPESA,EMOLA,MKESH,SIMO_REDE,IMALI',
],
[
'amount.required' => 'Campo amount é obrigatório',
'recharge_way.required' => 'Campo recharge_way é obrigatório',
'amount.min' => 'O valor minimo deve ser 10MT',
'amount.numeric' => 'Campo Montente deve ser númerico',
'reference.required' => 'Campo reference é obrigatório',
'recharge_way.in' => 'Campo recharge_way tem que estar entre:MPESA,EMOLA,MKESH,SIMO_REDE,IMALI',
'reference.digits' => 'Campo reference deve ter no maximo 9 digitos',
'reference.exists' => 'A referencia nao existe',
]
);
$imaliAccount = User::getAccount($request->reference);
if (!$imaliAccount) return SendResponse::errorResp404notfound('Referencia nao encontrada', 'Reference not found');
$user = User::getUserDetails($imaliAccount->user_id);
if (!$user) return SendResponse::errorResp404notfound('User da conta nao encontrada', 'User Account not found');
$transactionString = new TransactionGeneration();
$balanceActual = $imaliAccount->balance + $request->amount;
$masterAccount = MasterAccount::find(2);
$recharge = RechargeImaliAccount::create([
'imali_account_id' => $imaliAccount->id,
'transaction_id' => $transactionString->generateTransaction(),
'description' => $request->description,
'amount' => $request->amount,
'last_balance' => $imaliAccount->balance,
'balance' => $balanceActual,
'recharge_way' => $request->recharge_way,
'pending_recharge_id' => $request->pending_recharges_id,
'estado' => 'sucesso',
'estado_color' => '#388E3C',
'master_account_id' => $masterAccount->id,
'user_id' => $user->id
]);
$masterBalance = $masterAccount->balance + $request->amount;
$masterAccount->update(['balance' => $masterBalance]);
$imaliAccount->update(['balance' => $balanceActual]);
$data = array(
'transaction' => $recharge->transaction_id,
'name' => $user->name,
'description' => $request->description,
'amount' => (float)$recharge->amount,
'phone' => $user->phone,
'reference' => $imaliAccount->reference,
'data' => $recharge->created_at,
'estado' => $recharge->estado,
'route' => 'RECHARGE_DETAILS',
'recharge_way' => $recharge->recharge_way,
'account_number' => $user->account_number,
'terminal' => 'firebase'
);
$push = new PushNotification(
'Carregamento ' . $recharge->amount . ' MT',
'Parabéns, ' . 'carregaste ' . $recharge->amount . ' MT ' . ' na tua conta ' . $imaliAccount->account_number,
$user->firebase_token,
'com.imali.payapp.payment_RECHARGE_DETAILS',
'',
'ic_imali_logo_verde_01'
);
$push->sendPush($data);
return response()->json(['message' => 'Carregamento, feito com Sucesso'], 200);
}
public function rechargeAccount2(Request $request)
{
$transactionString = new TransactionGeneration();
$public_key = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAmptSWqV7cGUUJJhUBxsMLonux24u+FoTlrb+4Kgc6092JIszmI1QUoMohaDDXSVueXx6IXwYGsjjWY32HGXj1iQhkALXfObJ4DqXn5h6E8y5/xQYNAyd5bpN5Z8r892B6toGzZQVB7qtebH4apDjmvTi5FGZVjVYxalyyQkj4uQbbRQjgCkubSi45Xl4CGtLqZztsKssWz3mcKncgTnq3DHGYYEYiKq0xIj100LGbnvNz20Sgqmw/cH+Bua4GJsWYLEqf/h/yiMgiBbxFxsnwZl0im5vXDlwKPw+QnO2fscDhxZFAwV06bgG0oEoWm9FnjMsfvwm0rUNYFlZ+TOtCEhmhtFp+Tsx9jPCuOd5h2emGdSKD8A6jtwhNa7oQ8RtLEEqwAn44orENa1ibOkxMiiiFpmmJkwgZPOG/zMCjXIrrhDWTDUOZaPx/lEQoInJoE2i43VN/HTGCCw8dKQAwg0jsEXau5ixD0GUothqvuX3B9taoeoFAIvUPEq35YulprMM7ThdKodSHvhnwKG82dCsodRwY428kg2xM/UjiTENog4B6zzZfPhMxFlOSFX4MnrqkAS+8Jamhy1GgoHkEMrsT5+/ofjCx0HjKbT5NuA2V/lmzgJLl3jIERadLzuTYnKGWxVJcGLkWXlEPYLbiaKzbJb2sYxt+Kt5OxQqC1MCAwEAAQ==";
$api_host = "api.sandbox.vm.co.mz";
$api_key = "40dtaa0qj1xcw1rwytyszgq83lp523m0";
$origin = "*";
$service_provider_code = "171717";
$config = new \abdulmueid\mpesa\Config($public_key, $api_host, $api_key, $origin, $service_provider_code, '', '');
$transaction = new \abdulmueid\mpesa\Transaction($config);
$msisdn = '258' . $request->phone;
$amount = $request->amount;
$reference = 'T12344C';
// $third_party_reference = '111PA2D';
$third_party_reference = $transactionString->generateTransaction();
$user = User::query()->where('user_id', $request->user_id)->first();
$imaliAccount = ImaliAccount::query()->where('user_id', $user->id)->first();
if ($imaliAccount) {
$payment = $transaction->payment($msisdn, $amount, $reference, $third_party_reference);
if ($payment->getCode() == 'INS-0') {
if ($imaliAccount) {
$balanceActual = $imaliAccount->balance + $request->amount;
$masterAccount = MasterAccount::find(1);
$recharge = RechargeImaliAccount::create([
'imali_account_id' => $imaliAccount->id,
'transaction_id' => $transactionString->generateTransaction(),
'amount' => $request->amount,
'last_balance' => $imaliAccount->balance,
'balance' => $balanceActual,
'recharge_way' => 'M-pesa' . $request->phone,
'estado' => 'sucesso',
'estado_color' => '#388E3C',
'master_account_id' => $masterAccount->id
]);
$masterBalance = $masterAccount->balance + $request->amount;
$masterAccount->update(['balance' => $masterBalance]);
if ($recharge) {
$imaliAccount->update(['balance' => $balanceActual]);
$log = new Record();
$log->createLog([
'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
'details' => 'Carregamento, feito com Sucesso',
'operation' => 'Recharge by M-pesa',
'status' => 'success',
'user_id' => $request->user()->id
]);
return response()->json(['message' => 'Carregamento, feito com Sucesso', 'code' => ''], 200);
}
}
}
if ($payment->getCode() == 'INS-2006') {
$log = new Record();
$log->createLog([
'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
'details' => 'Saldo Insuficiente',
'operation' => 'Recharge by M-pesa',
'status' => 'Error',
'user_id' => $request->user()->id
]);
return response()->json(['message' => 'Saldo Insuficiente'], 422);
}
if ($payment->getCode() == 'INS-9') {
$log = new Record();
$log->createLog([
'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
'details' => 'Excedeu o tempo limite de transacção',
'operation' => 'Recharge by M-pesa',
'status' => 'Error',
'user_id' => $request->user()->id
]);
return response()->json(['message' => 'Excedeu o tempo limite de transacção'], 408);
}
if ($payment->getCode() == 'INS-9') {
$log = new Record();
$log->createLog([
'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
'details' => 'Valor inválido',
'operation' => 'Recharge by M-pesa',
'status' => 'Error',
'user_id' => $request->user()->id
]);
return response()->json(['message' => 'Valor inválido'], 400);
}
if ($payment->getCode() == 'INS-995') {
$log = new Record();
$log->createLog([
'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
'details' => 'Conta Mpesa com Problemas',
'operation' => 'Recharge by M-pesa',
'status' => 'Error',
'user_id' => $request->user()->id
]);
return response()->json(['message' => 'Conta Mpesa com Problemas'], 400);
}
if ($payment->getCode() == 'INS-996') {
$log = new Record();
$log->createLog([
'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
'details' => 'Este número nao tem conta Mpesa',
'operation' => 'Recharge by M-pesa',
'status' => 'Error',
'user_id' => $request->user()->id
]);
return response()->json(['message' => 'Este número nao tem conta Mpesa'], 400);
}
}
}
public function rechargeAccount(Request $request)
{
$transactionString = new TransactionGeneration();
$public_key = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAmptSWqV7cGUUJJhUBxsMLonux24u+FoTlrb+4Kgc6092JIszmI1QUoMohaDDXSVueXx6IXwYGsjjWY32HGXj1iQhkALXfObJ4DqXn5h6E8y5/xQYNAyd5bpN5Z8r892B6toGzZQVB7qtebH4apDjmvTi5FGZVjVYxalyyQkj4uQbbRQjgCkubSi45Xl4CGtLqZztsKssWz3mcKncgTnq3DHGYYEYiKq0xIj100LGbnvNz20Sgqmw/cH+Bua4GJsWYLEqf/h/yiMgiBbxFxsnwZl0im5vXDlwKPw+QnO2fscDhxZFAwV06bgG0oEoWm9FnjMsfvwm0rUNYFlZ+TOtCEhmhtFp+Tsx9jPCuOd5h2emGdSKD8A6jtwhNa7oQ8RtLEEqwAn44orENa1ibOkxMiiiFpmmJkwgZPOG/zMCjXIrrhDWTDUOZaPx/lEQoInJoE2i43VN/HTGCCw8dKQAwg0jsEXau5ixD0GUothqvuX3B9taoeoFAIvUPEq35YulprMM7ThdKodSHvhnwKG82dCsodRwY428kg2xM/UjiTENog4B6zzZfPhMxFlOSFX4MnrqkAS+8Jamhy1GgoHkEMrsT5+/ofjCx0HjKbT5NuA2V/lmzgJLl3jIERadLzuTYnKGWxVJcGLkWXlEPYLbiaKzbJb2sYxt+Kt5OxQqC1MCAwEAAQ==";
$api_host = "api.sandbox.vm.co.mz";
$api_key = "40dtaa0qj1xcw1rwytyszgq83lp523m0";
$origin = "*";
$service_provider_code = "171717";
$reference = 'T12344C';
$third_party_reference = $transactionString->generateTransaction();
$client = new Client([
'apiKey' => $api_key, // API Key
'publicKey' => $public_key, // Public Key
'serviceProviderCode' => $service_provider_code // input_ServiceProviderCode
]);
$paymentData = [
// 'from' => '+258845030902', // input_CustomerMSISDN
'from' => '258' . $request->phone, // input_CustomerMSISDN
// 'from' => $request->phone, // input_CustomerMSISDN
'reference' => '111PA2D', // input_ThirdPartyReference
'transaction' => $third_party_reference, // input_TransactionReference
'amount' => $request->amount // input_Amount
];
$user = User::query()->where('user_id', $request->user_id)->first();
$imaliAccount = ImaliAccount::query()->where('user_id', $user->id)->first();
if ($imaliAccount) {
// $payment = $transaction->payment($msisdn, $amount, $reference, $third_party_reference);
// $results = $client->receive($paymentData);
$results = $client->receive($paymentData);
if ($results->success) {
// Handle success
// if ($result->getCode() == 'INS-0') {
// return response()->json($result);
if ($imaliAccount) {
$balanceActual = $imaliAccount->balance + $request->amount;
$masterAccount = MasterAccount::find(1);
$recharge = RechargeImaliAccount::create([
'imali_account_id' => $imaliAccount->id,
'transaction_id' => $transactionString->generateTransaction(),
'amount' => $request->amount,
'last_balance' => $imaliAccount->balance,
'balance' => $balanceActual,
'recharge_way' => 'M-pesa' . $request->phone,
'estado' => 'sucesso',
'estado_color' => '#388E3C',
'master_account_id' => $masterAccount->id
]);
$masterBalance = $masterAccount->balance + $request->amount;
$masterAccount->update(['balance' => $masterBalance]);
if ($recharge) {
$imaliAccount->update(['balance' => $balanceActual]);
$log = new Record();
$log->createLog([
'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
'details' => 'Carregamento, feito com Sucesso',
'operation' => 'Recharge by M-pesa',
'status' => 'success',
'user_id' => $request->user()->id
]);
return response()->json(['message' => 'Carregamento, feito com Sucesso', 'code' => ''], 200)->header('Content-Type', 'application/json');
}
}
// }
} else {
// return response()->json($result);
// Handle failure
// if ($result->getCode() == 'INS-2006') {
//
// $log = new Record();
// $log->createLog([
// 'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
// 'details' => 'Saldo Insuficiente',
// 'operation' => 'Recharge by M-pesa',
// 'status' => 'Error',
// 'user_id' => $request->user()->id
// ]);
//
// return response()->json(['message' => 'Saldo Insuficiente'], 422);
// }
// if ($result->getCode() == 'INS-9') {
//
// $log = new Record();
// $log->createLog([
// 'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
// 'details' => 'Excedeu o tempo limite de transacção',
// 'operation' => 'Recharge by M-pesa',
// 'status' => 'Error',
// 'user_id' => $request->user()->id
// ]);
//
// return response()->json(['message' => 'Excedeu o tempo limite de transacção'], 408);
// }
// if ($result->getCode() == 'INS-9') {
//
// $log = new Record();
// $log->createLog([
// 'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
// 'details' => 'Valor inválido',
// 'operation' => 'Recharge by M-pesa',
// 'status' => 'Error',
// 'user_id' => $request->user()->id
// ]);
//
// return response()->json(['message' => 'Valor inválido'], 400);
// }
// if ($result->getCode() == 'INS-995') {
//
//
// $log = new Record();
// $log->createLog([
// 'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
// 'details' => 'Conta Mpesa com Problemas',
// 'operation' => 'Recharge by M-pesa',
// 'status' => 'Error',
// 'user_id' => $request->user()->id
// ]);
//
// return response()->json(['message' => 'Conta Mpesa com Problemas'], 400);
// }
// if ($result->getCode() == 'INS-996') {
//
// $log = new Record();
// $log->createLog([
// 'description' => $imaliAccount->account_number . ' ' . $user->name . ' ' . $user->last_name,
// 'details' => 'Este número nao tem conta Mpesa',
// 'operation' => 'Recharge by M-pesa',
// 'status' => 'Error',
// 'user_id' => $request->user()->id
// ]);
//
// return response()->json(['message' => 'Este número nao tem conta Mpesa'], 400);
// }
}
}
}
public function bankConnections()
{
$banks = BankConection::all();
return response()->json(['data' => $banks], 200);
}
public function users()
{
$users = User::all();
return response()->json(['data' => $users], 200);
}
public function resendCode(Request $request)
{
$token = new GenerateToken();
$data = ['phone' => $request->phone, 'signature' => $request->signature, 'codigo' => $token->generatePhoneNumberCode()];
$this->smsManager->smsVerifyUser($data);
$validate = PhoneValidation::query()->where('phone', $request->phone)->count();
$convert = strtotime(date('Y-m-d H:i:s')) + (60 * 10);
$duration = date("Y-m-d H:i:s", $convert);
if ($validate === 0) {
$save = PhoneValidation::create([
'phone' => $request->phone,
'country_code' => $request->country_code,
'expire_at' => $duration,
'duration' => 5,
'codigo' => $data['codigo'],
'is_Validated' => 0
]);
if ($save) {
$log = new Record();
$log->createLog([
'description' => $request->phone . ' ' . $data['codigo'],
'details' => 'Código de Verificação enviado com sucesso!',
'operation' => 'Resend Verification code',
'status' => 'Success',
'user_id' => $request->user()->id
]);
return response()->json(['message' => 'Código de Verificação enviado com sucesso!'], 200);
}
} else {
$validate = PhoneValidation::query()->where('phone', $request->phone)->first();
$save = $validate->update(['codigo' => $data['codigo'], 'expire_at' => $duration]);
if ($save) {
$data = ['phone' => $request->phone, 'signature' => $request->signature, 'codigo' => $validate->codigo];
return response()->json(['message' => 'Código de Verificação reenviado com sucesso!'], 200);
}
}
}
public function resendCodeOld(Request $request)
{
$token = new GenerateToken();
$validate = PhoneValidation::query()->where('phone', $request->phone)->count();
$phoneValidate = PhoneValidation::query()->where('phone', $request->phone)->first();
if ($validate === 0) {
$data = ['phone' => $request->phone, 'codigo' => $token->generatePhoneNumberCode()];
$sms = new SendSMS();
$save = PhoneValidation::create([
'phone' => $request->phone,
'expire_at' => now(),
'duration' => 5,
'codigo' => $data['codigo'],
'is_Validated' => 1
]);
$sent = $sms->verifyUser($data);
if ($save) {
$log = new Record();
$log->createLog([
'description' => $request->phone . ' ' . $data['codigo'],
'details' => 'Código de Verificação enviado com sucesso!',
'operation' => 'Resend Verification code',
'status' => 'Success',
'user_id' => $request->user()->id
]);
return response()->json(['message' => 'Código de Verificação enviado com sucesso!'], 200);
}
} else {
$validate = PhoneValidation::query()->where('phone', $request->phone)->first();
// $save = $validate->update(['codigo' => $data['codigo']]);
if ($validate) {
$data = ['phone' => $request->phone, 'codigo' => $validate->phone];
$sms = new SendSMS();
$sms->verifyUser($data);
return response()->json(['message' => 'Código de Verificação reenviado com sucesso!', 'codigo' => $data['codigo']], 200);
}
}
}
public function verifyUserNumber(Request $request)
{
// $firstReplace= str_replace(' ', '',$request->phone);
// $request['phone'] = str_replace('-', '',$firstReplace);
$this->validate($request, [
'name' => 'required',
'phone' => 'required|unique:users|min:9',
'email' => 'required|email|unique:users,email',
'password' => 'required|min:8',
'last_name' => 'required',
//'bi' => 'required|min:13'
], [
'email.required' => 'O Campo Email é de carácter Obrigatório',
'email.unique' => 'Este Email já está em uso',
'phone.required' => 'O Número do celular é obrigatório',
'phone.unique' => 'O Número do celular já está em uso',
'phone.min' => 'O Campo Celular deve ter 9 dígitos',
'name.required' => 'O Campo Nome é obrigatório',
'last_name.required' => 'O Campo Apelido é obrigatório',
//'bi.required' => 'O campo Bi é Obrigatório',
// 'bi.min'=>'O campo Bi ter 13 dígitos',
'password.required' => 'O Campo Senha é obrigatório',
//'password.confirmed' => 'Senhas incompatíveis',
'password.min' => 'A senha deve ter 8 digitos no mínimo'
]);
$token = new GenerateToken();
$data = ['phone' => $request->phone, 'signature' => $request->signature, 'codigo' => $token->generatePhoneNumberCode()];
//?Temporario
//$this->smsManager->smsVerifyUser($data);
try {
//code...
$this->smsManager->smsVerifyUser($data);
} catch (\Throwable $th) {
//throw $th;
Log::info('Outgoing Response', [
'content' => $th->getMessage(),
'error_line' => $th->getLine(),
'error_file' => $th->getFile(),
]);
SendResponse::warningResp500serverError('Serviço de SMS indisponível', 'SMS service unavailable');
}
//$validate = PhoneValidation::query()->where('phone', $request->phone)->where('is_Validated', 0)->count();
$validate = PhoneValidation::query()->where('phone', $request->phone)->count();
$convert = strtotime(date('Y-m-d H:i:s')) + (60 * 10);
$duration = date("Y-m-d H:i:s", $convert);
if ($validate === 0) {
$save = PhoneValidation::create([
'phone' => $request->phone,
'country_code' => $request->country_code,
'expire_at' => $duration,
'duration' => 5,
'codigo' => $data['codigo'],
'is_Validated' => 0
]);
if ($save) {
//$log = new Record();
//$log->createLog([
// 'description' => $request->phone . ' ' . $data['codigo'],
// 'details' => 'Código de Verificação enviado com sucesso!',
// 'operation' => 'Resend Verification code',
// 'status' => 'Success',
// 'user_id' => $request->user()->id
//]);
return response()->json(['message' => 'Codigo de Verificação enviado com sucesso!'], 200);
}
} else {
$validate = PhoneValidation::query()->where('phone', $request->phone)->first();
$save = $validate->update(['codigo' => $data['codigo'], 'expire_at' => $duration]);
if ($save) {
$data = ['phone' => $request->phone, 'signature' => $request->signature, 'codigo' => $validate->codigo];
return response()->json(['message' => 'Codigo de Verificação enviado com sucesso!', 'codigo' => $data['codigo']], 200);
}
}
}
public function sendSMSToken(Request $request)
{
try {
$this->validate($request, [
'phone' => 'required|unique:users|min:9',
], [
'phone.required' => 'O Número do celular é obrigatório',
'phone.unique' => 'O Número do celular já está em uso',
'phone.min' => 'O Campo Celular deve ter 9 dígitos',
]);
} catch (ValidationException $ve) {
return response()->json([
'message' => $ve->getMessage(),
'errors' => $ve->errors()
], 400);
}
$token = new GenerateToken();
$data = ['phone' => $request->phone, 'signature' => $request->signature, 'codigo' => $token->generatePhoneNumberCode()];
$this->smsManager->smsVerifyUser($data);
$validate = PhoneValidation::query()->where('phone', $request->phone)->count();
$convert = strtotime(date('Y-m-d H:i:s')) + (60 * 10);
$duration = date("Y-m-d H:i:s", $convert);
if ($validate === 0) {
$save = PhoneValidation::create([
'phone' => $request->phone,
'country_code' => $request->country_code,
'expire_at' => $duration,
'duration' => 2,
'codigo' => $data['codigo'],
'is_Validated' => 0
]);
if ($save) {
return response()->json(['message' => 'Código de Verificação enviado com sucesso!'], 200);
}
} else {
$validate = PhoneValidation::query()->where('phone', $request->phone)->first();
$save = $validate->update(['codigo' => $data['codigo'], 'expire_at' => $duration]);
if ($save) {
$data = ['phone' => $request->phone, 'signature' => $request->signature, 'codigo' => $validate->codigo];
return response()->json(['message' => 'Código de Verificação reenviado com sucesso!'], 200);
}
}
}
public function checkCodigo(Request $request)
{
$this->validate($request, [
'phone' => 'required|unique:users|min:9',
'codigo' => 'required|min:6'
], [
'phone.required' => 'O Número do celular é obrigatório',
'phone.unique' => 'O Número do celular já está em uso',
'phone.min' => 'O Campo Celular deve ter 9 dígitos',
'codigo.required' => 'O campo codigo é Obrigatório',
'codigo.min' => 'O campo codigo ter 6 dígitos',
]);
try {
$validate = PhoneValidation::query()->where('phone', $request->phone)->where('codigo', $request->codigo)->first();
//return $validate;
if (!$validate) return response()->json(['message' => "Token invalido"], 400);
$is_expired = strtotime($validate->expire_at) - strtotime(date('Y-m-d H:i:s'));
if ($is_expired < 0) return response()->json(['message' => "Token expirado"], 400);
$convert = strtotime(date('Y-m-d H:i:s')) - (60 * 10);
$duration = date("Y-m-d H:i:s", $convert);
$validate->is_Validated = 1;
$validate->expire_at = $duration;
$validate->update();
$log = new Record();
$log->createLog([
'description' => $request->phone,
'details' => 'Celular Verificado com Successo!',
'operation' => 'Check Phone Validation',
'status' => 'Success',
'user_id' => 1
]);
return response()->json(['message' => 'Celular Verificado com Successo!'], 200);
} catch (\Exception $exception) {
return response()->json($exception);
}
}
public function checkCodigOld(Request $request)
{
try {
$validate = PhoneValidation::query()->where('phone', $request->phone)->where('codigo', $request->codigo)->where('is_Validated', 0)->first();
//$validate = PhoneValidation::query()->where('phone', $request->phone)->where('codigo', $request->codigo)->count();
if ($validate) {
$validate->is_Validated = 1;
$validate->update();
$log = new Record();
$log->createLog([
'description' => $request->phone,
'details' => 'Celular Verificado com Successo!',
'operation' => 'Check Phone Validation',
'status' => 'Success',
'user_id' => 1
]);
return response()->json(['message' => 'Celular Verificado com Successo!'], 200);
} else {
$log = new Record();
$log->createLog([
'description' => $request->phone,
'details' => 'Código inválido',
'operation' => 'Check Phone Validation',
'status' => 'Error',
'user_id' => 1
]);
return response()->json(['message' => 'Código inválido'], 400);
}
} catch (Exception $exception) {
return response()->json($exception);
}
}
public function getUsers()
{
return response()->json(['users' => User::all()]);
}
public function getImaliAccounts(Request $request)
{
$perPage = !!$request->input('per_page') ? $request->input('per_page') : 10;
$orderType = $request->input('order_type') === 'ASC' ? 'ASC' : 'DESC';
$orderBy = !!$request->input('order_by') && $request->input('order_by') !== 'null' ? $request->input('order_by') : 'users.id';
$users = User::query()
->with([
'imaliAccount' => function ($imali) {
return $imali->join('imali_account_configs', 'imali_account_configs.id', '=', 'imali_accounts.imali_account_config')
->select(
'imali_accounts.*',
'imali_account_configs.level'
)->get();
},
'imaliBusinessAccount' => function ($business) {
return $business->join('imali_account_configs', 'imali_account_configs.id', '=', 'business_accounts.imali_account_config')
->select(
'business_accounts.*',
'imali_account_configs.level'
)->get();
},
'document' => function ($document) {
// return $document->orderBy('id', 'desc')->get()->toArray()[0];
return $document->orderBy('id', 'desc')->get();
// return $document->latest()->first();
}
])
->orderBy($orderBy, $orderType)
->paginate($perPage);
// ->map(function ($user) {
// // Remove os relacionamentos originais
// $combined_accounts = array_merge(
// $user->imaliAccount ? $user->imaliAccount->toArray() : [],
// $user->imaliBusinessAccount ? $user->imaliBusinessAccount->toArray() : []
// );
// if ($user->profile === 'client')
// $user->last_recharge = $user->imaliAccount->recharges()->orderBy('id', 'desc')->first();
// else
// $user->last_recharge = $user->imaliBusinessAccount->recharges()->orderBy('id', 'desc')->first();
// unset($user->imaliAccount, $user->imaliBusinessAccount);
// $user->imaliAccount = $combined_accounts;
// return $user;
// });
$imali = $users->setCollection($users->getCollection()
->transform(function ($user) {
$combined_accounts = array_merge(
$user->imaliAccount ? $user->imaliAccount->toArray() : [],
$user->imaliBusinessAccount ? $user->imaliBusinessAccount->toArray() : []
);
if ($user->profile === 'client')
$user->last_recharge = $user->imaliAccount->recharges()->orderBy('id', 'desc')->first();
else
$user->last_recharge = $user->imaliBusinessAccount->recharges()->orderBy('id', 'desc')->first();
unset($user->imaliAccount, $user->imaliBusinessAccount);
$user->imaliAccount = $combined_accounts;
return $user;
}));
$imali->makeHidden([
'password',
'pin',
'remember_token',
'firebase_token'
]);
return response()->json($imali);
}
public function getImaliAccountsORIGINAL(Request $request)
{
$perPage = !!$request->input('per_page') ? $request->input('per_page') : 10;
$orderType = $request->input('order_type') === 'ASC' ? 'ASC' : 'DESC';
$orderBy = !!$request->input('order_by') && $request->input('order_by') !== 'null' ? $request->input('order_by') : 'imali_accounts.id';
$users = User::query()->join('imali_accounts', 'imali_accounts.user_id', '=', 'users.id')
->join('imali_account_configs', 'imali_account_configs.id', '=', 'imali_accounts.imali_account_config')
->select('imali_accounts.*', 'imali_account_configs.level', 'users.id', 'users.name', 'users.last_name', 'users.name', 'users.country_code', 'users.email', 'users.phone', 'users.status')
->orderBy($orderBy, $orderType)->paginate($perPage);
$imali = $users->setCollection($users->getCollection()
->transform(function ($item) {
$item['last_recharge'] = $item->imaliAccount->recharges()->orderBy('id', 'desc')->first();
$item['document'] = $item->documents()->orderBy('id', 'desc')->first();
return $item;
}));
$imali->makeHidden([
'password',
'pin',
'imali_account_config',
'profile',
'remember_token',
'firebase_token'
]);
return response()->json($imali);
}
public function updateUserData(Request $request)
{
$user = $imali = ImaliAccount::query()
->join('users', 'users.id', '=', 'imali_accounts.user_id')
->join('imali_account_configs', 'imali_account_configs.id', '=', 'imali_accounts.imali_account_config')
->where('users.user_id', $request->user_id)
->first();
if ($user) {
$u = User::find($user->id);
$u->update([
'name' => $request->name,
'last_name' => $request->last_name,
'profile' => $request->profile,
'status' => $request->status,
'birthday' => $request->birthday,
'bi' => $request->bi,
]);
$kyc = ImaliAccount::query()->where('user_id', $user->id)->first();
if ($kyc) {
$kyc->update([
'imali_account_config' => $request->imali_account_config
]);
}
return response()->json(['message' => 'Dados do Cliente Actualizados com Sucesso!'], 200);
}
}
public function updateUserStatus($account_number)
{
// $imali = ImaliAccount::query()->where('account_number', $account_number)->first();
// $user = User::findOrFail($imali->user_id);
$account = User::getAccount($account_number);
$user = User::getUserDetails($account->user_id);
$user->status = !$user->status;
$user->login_attempts = 0;
$user->pin_attempts = 0;
$user->user_update_info_status = 0;
$user->password = Hash::make('12345678');
$user->save();
// return "Chegou";
return response()->json(['message' => 'Estado actualizado com sucesso!'], 200);
}
public function updateUserDataMobile(Request $request)
{
$user = $request->user();
if ($user) {
$update = User::query()
->where('id', $user->id)
->update([
'name' => $request->name,
'last_name' => $request->last_name,
'bi' => $request->bi,
'birthday' => $request->birthday,
]);
if ($update) {
return response()->json(['message' => 'Dados Actualizados com Sucesso'], 200);
}
}
}
public function changePassword(Request $request)
{
$this->validate(
$request,
[
'current_password' => ['required', new CurrentPassword()],
// 'new_password' => 'required|min:8|confirmed',
'new_password' => ['required', 'min:8', 'confirmed'],
'new_password_confirmation' => 'required|min:8',
],
[
'current_password.required' => 'O Campo Senha Actual é Obrigatório',
'new_password.required' => 'O Campo Nova Senha é Obrigatório',
'new_password_confirmation.required' => 'O Campo Confirmar Senha é Obrigatório',
'new_password.confirmed' => 'Senhas incompatíveis',
'current_password.min' => 'A senha deve ter 8 digitos no mínimo',
'new_password.min' => 'A senha deve ter 8 digitos no mínimo',
'new_password_confirmation.min' => 'A senha deve ter 8 digitos no mínimo'
]
);
if (Hash::check($request->current_password, $request->user()->password)) {
$request->user()->update([
'password' => bcrypt($request->new_password)
]);
return response()->json(['message' => 'Senhas Compativeis'], 200);
} else {
return response()->json(['message' => 'Senha Antiga Inválida'], 404);
}
}
public function uploadPhoto(Request $request)
{
return $request->all();
}
public function disableUser($id)
{
$user = User::query()->where('user_id', $id)->first();
if ($user->status === 1) {
$update = $user->update(['status' => 0]);
return response()->json(['message' => 'Utilizador Bloqueado com Sucesso'], 200);
} else {
return response()->json(['message' => 'Utilizador Activo com Sucesso'], 200);
}
}
public function generateAmount(Request $request)
{
$imali = ImaliAccount::query()->where('user_id', $request->user()->id)->first();
$save = AmountGenerate::create([
'user_id' => $request->user()->id,
'transaction' => Uuid::generate()->string,
'amount' => $request->amount,
'account_number' => $imali->account_number,
'qrcode' => '',
'firebase_token' => $request->firebase_token
]);
// $log = new Record();
// $log->createLog([
// 'description' => $save->account_number . ' ' . $save->amount . ' ' . $save->transaction,
// 'details' => 'Codigo gerado com Sucesso',
// 'operation' => 'Generate Amount to Receiver By Qrcode',
// 'status' => 'Success',
// 'user_id' => $request->user()->id
// ]);
return response()->json(['message' => 'Codigo gerado com Sucesso', 'transaction' => $save->transaction, 'account_number' => $save->account_number, 'amount' => $save->amount], 200);
}
public function getClientDataForPayment($transaction)
{
$client = AmountGenerate::query()
->join('users', 'users.id', '=', 'amount_generates.user_id')
->join('imali_accounts', 'imali_accounts.user_id', '=', 'amount_generates.user_id')
->where('amount_generates.transaction', $transaction)
// ->select('amount_generates.amount','amount_generates.transaction', 'users.name', 'imali_accounts.account_number')
->select('amount_generates.amount', 'users.name', 'imali_accounts.account_number')
// ->select('amount_generates.*', 'users.name', 'imali_accounts.account_number')
->first();
if ($client) {
return response()->json($client, 200);
} else {
$user = ImaliAccount::query()
->join('users', 'users.id', '=', 'imali_accounts.user_id')
// ->join('recharge_imali_accounts', 'recharge_imali_accounts.imali_account_id', '=', 'imali_accounts.id')
->where('imali_accounts.account_number', $transaction)
->select('users.name', 'imali_accounts.account_number')
->first();
return response()->json($user, 200);
}
}
public function getClientAccount($aacount)
{
$client = AmountGenerate::query()
->join('users', 'users.id', '=', 'amount_generates.user_id')
->join('imali_accounts', 'imali_accounts.user_id', '=', 'amount_generates.user_id')
->where('amount_generates.transaction', $aacount)
// ->select('amount_generates.amount','amount_generates.transaction', 'users.name', 'imali_accounts.account_number')
->select('amount_generates.amount', 'users.name', 'imali_accounts.account_number')
// ->select('amount_generates.*', 'users.name', 'imali_accounts.account_number')
->first();
return response()->json($client, 200);
}
public function checkPin(Request $request)
{
$this->validate(
$request,
[
'pin' => 'required',
],
[
'pin.required' => 'A senha obrigatoria'
]
);
if (strlen($request->pin) == 3)
$request->pin = '0' . $request->pin;
if (strlen($request->pin) == 2)
$request->pin = '00' . $request->pin;
if (strlen($request->pin) == 1)
$request->pin = '000' . $request->pin;
$user = User::find($request->user()->id);
if (Hash::check($request->pin, $user->pin)) {
return response()->json(['message' => 'Pin Verificado'], 201);
} else {
return response()->json(['message' => 'Pin Incorrecto'], 400);
}
}
public function getBalance(Request $request)
{
// return $request->all();
$imali = ImaliAccount::query()
->join('users', 'users.id', '=', 'imali_accounts.user_id')
->where('users.phone', $request->phone)
->first();
if ($imali) {
return response()->json($imali);
} else {
return response()->json(['message' => 'Conta invalida']);
}
}
public function updateFirebaseToken(Request $request) {}
public function reverteTransaction(Request $request)
{
$transactionString = new TransactionGeneration();
$public_key = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAmptSWqV7cGUUJJhUBxsMLonux24u+FoTlrb+4Kgc6092JIszmI1QUoMohaDDXSVueXx6IXwYGsjjWY32HGXj1iQhkALXfObJ4DqXn5h6E8y5/xQYNAyd5bpN5Z8r892B6toGzZQVB7qtebH4apDjmvTi5FGZVjVYxalyyQkj4uQbbRQjgCkubSi45Xl4CGtLqZztsKssWz3mcKncgTnq3DHGYYEYiKq0xIj100LGbnvNz20Sgqmw/cH+Bua4GJsWYLEqf/h/yiMgiBbxFxsnwZl0im5vXDlwKPw+QnO2fscDhxZFAwV06bgG0oEoWm9FnjMsfvwm0rUNYFlZ+TOtCEhmhtFp+Tsx9jPCuOd5h2emGdSKD8A6jtwhNa7oQ8RtLEEqwAn44orENa1ibOkxMiiiFpmmJkwgZPOG/zMCjXIrrhDWTDUOZaPx/lEQoInJoE2i43VN/HTGCCw8dKQAwg0jsEXau5ixD0GUothqvuX3B9taoeoFAIvUPEq35YulprMM7ThdKodSHvhnwKG82dCsodRwY428kg2xM/UjiTENog4B6zzZfPhMxFlOSFX4MnrqkAS+8Jamhy1GgoHkEMrsT5+/ofjCx0HjKbT5NuA2V/lmzgJLl3jIERadLzuTYnKGWxVJcGLkWXlEPYLbiaKzbJb2sYxt+Kt5OxQqC1MCAwEAAQ==";
$api_host = "api.sandbox.vm.co.mz";
$api_key = "40dtaa0qj1xcw1rwytyszgq83lp523m0";
$origin = "*";
$service_provider_code = "171717";
$reference = 'T12344C';
$client = new Client([
'apiKey' => $api_key, // API Key
'publicKey' => $public_key, // Public Key
'serviceProviderCode' => $service_provider_code // input_ServiceProviderCode
]);
$transaction = RechargeImaliAccount::query()
->where('id', $request->id)
->where('transaction_id', $request->transaction)
->where('imali_account_id', $request->imali_account_id)
->first();
$paymentData = [
'reference' => 'T12344C', // input_ThirdPartyReference
'transaction' => $transaction->transaction_id, // input_TransactionReference
'amount' => $transaction->amount // input_Amount
];
$transactionString = new TransactionGeneration();
if ($transaction) {
$results = $client->revert($paymentData);
if ($results->success) {
ReverteImaliAccount::create([
'transaction' => $transactionString->generateTransaction(),
'user_id' => $request->user()->id,
'imali_account_id' => $transaction->imali_account_id,
'recharge_imali_account_id' => $transaction->id
]);
return response()->json(['message' => 'Transacção revertida com Sucesso'], 200);
}
}
}
public function sendMoneyImaliMpesa(Request $request)
{
$transactionString = new TransactionGeneration();
$public_key = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAmptSWqV7cGUUJJhUBxsMLonux24u+FoTlrb+4Kgc6092JIszmI1QUoMohaDDXSVueXx6IXwYGsjjWY32HGXj1iQhkALXfObJ4DqXn5h6E8y5/xQYNAyd5bpN5Z8r892B6toGzZQVB7qtebH4apDjmvTi5FGZVjVYxalyyQkj4uQbbRQjgCkubSi45Xl4CGtLqZztsKssWz3mcKncgTnq3DHGYYEYiKq0xIj100LGbnvNz20Sgqmw/cH+Bua4GJsWYLEqf/h/yiMgiBbxFxsnwZl0im5vXDlwKPw+QnO2fscDhxZFAwV06bgG0oEoWm9FnjMsfvwm0rUNYFlZ+TOtCEhmhtFp+Tsx9jPCuOd5h2emGdSKD8A6jtwhNa7oQ8RtLEEqwAn44orENa1ibOkxMiiiFpmmJkwgZPOG/zMCjXIrrhDWTDUOZaPx/lEQoInJoE2i43VN/HTGCCw8dKQAwg0jsEXau5ixD0GUothqvuX3B9taoeoFAIvUPEq35YulprMM7ThdKodSHvhnwKG82dCsodRwY428kg2xM/UjiTENog4B6zzZfPhMxFlOSFX4MnrqkAS+8Jamhy1GgoHkEMrsT5+/ofjCx0HjKbT5NuA2V/lmzgJLl3jIERadLzuTYnKGWxVJcGLkWXlEPYLbiaKzbJb2sYxt+Kt5OxQqC1MCAwEAAQ==";
$api_host = "api.sandbox.vm.co.mz";
$api_key = "40dtaa0qj1xcw1rwytyszgq83lp523m0";
$origin = "*";
$service_provider_code = "171717";
$reference = 'T12344C';
$third_party_reference = $transactionString->generateTransaction();
$client = new Client([
'apiKey' => $api_key, // API Key
'publicKey' => $public_key, // Public Key
'serviceProviderCode' => $service_provider_code // input_ServiceProviderCode
]);
$paymentData = [
'to' => '258' . $request->phone, // input_CustomerMSISDN
'reference' => 'T12344C', // input_ThirdPartyReference
'transaction' => $third_party_reference, // input_TransactionReference
'amount' => $request->amount // input_Amount
];
$user = User::query()->where('user_id', $request->user_id)->first();
// $imaliAccount = ImaliAccount::query()->where('user_id', $user->id)->first();
$imaliAccount = ImaliAccount::query()->where('user_id', $request->user_id)->first();
$total = ($request->amount + $request->amount * 0.3);
if ($imaliAccount->balance >= $total) {
$results = $client->send($paymentData);
if ($results->success) {
SendMoneyImaliMpesa::create([
'transaction' => $third_party_reference,
'fee' => ($request->amount * 0.3),
'fee_type' => '3%',
'amount' => $request->amount,
'imali_account' => $request->imali_account,
'admin_id' => $request->admin_id,
'user_id' => $request->user_id,
'phone' => $request->phone
]);
// dd($results);
return response()->json(['message' => 'Transacção ' . $results->data['transaction'] . ' efectuada com Sucesso'], 200);
}
}
}
public function sendMoneyB2B(Request $request)
{
$transactionString = new TransactionGeneration();
$public_key = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAmptSWqV7cGUUJJhUBxsMLonux24u+FoTlrb+4Kgc6092JIszmI1QUoMohaDDXSVueXx6IXwYGsjjWY32HGXj1iQhkALXfObJ4DqXn5h6E8y5/xQYNAyd5bpN5Z8r892B6toGzZQVB7qtebH4apDjmvTi5FGZVjVYxalyyQkj4uQbbRQjgCkubSi45Xl4CGtLqZztsKssWz3mcKncgTnq3DHGYYEYiKq0xIj100LGbnvNz20Sgqmw/cH+Bua4GJsWYLEqf/h/yiMgiBbxFxsnwZl0im5vXDlwKPw+QnO2fscDhxZFAwV06bgG0oEoWm9FnjMsfvwm0rUNYFlZ+TOtCEhmhtFp+Tsx9jPCuOd5h2emGdSKD8A6jtwhNa7oQ8RtLEEqwAn44orENa1ibOkxMiiiFpmmJkwgZPOG/zMCjXIrrhDWTDUOZaPx/lEQoInJoE2i43VN/HTGCCw8dKQAwg0jsEXau5ixD0GUothqvuX3B9taoeoFAIvUPEq35YulprMM7ThdKodSHvhnwKG82dCsodRwY428kg2xM/UjiTENog4B6zzZfPhMxFlOSFX4MnrqkAS+8Jamhy1GgoHkEMrsT5+/ofjCx0HjKbT5NuA2V/lmzgJLl3jIERadLzuTYnKGWxVJcGLkWXlEPYLbiaKzbJb2sYxt+Kt5OxQqC1MCAwEAAQ==";
$api_host = "api.sandbox.vm.co.mz";
$api_key = "40dtaa0qj1xcw1rwytyszgq83lp523m0";
$origin = "*";
$service_provider_code = "171717";
$reference = 'T12344C';
$third_party_reference = $transactionString->generateTransaction();
$client = new Client([
'apiKey' => $api_key, // API Key
'publicKey' => $public_key, // Public Key
'serviceProviderCode' => $service_provider_code // input_ServiceProviderCode
]);
// 979797
$paymentData = [
'to' => $request->entity, // input_ReceiverPartyCode
'reference' => '111PA2D', // input_ThirdPartyReference
'transaction' => $third_party_reference, // input_TransactionReference
'amount' => $request->amount // input_Amount
];
$results = $client->send($paymentData);
if ($results->success) {
SendMoneyB2B::create([
'entity' => $request->entity,
'amount' => $request->amount,
'admin_id' => $request->user()->id,
'transaction' => $third_party_reference,
]);
}
return response()->json(['message' => 'Transacção efectuada com Sucesso'], 200);
}
public function sendSMS(Request $request)
{
$data = [$request->phone];
$sms = new SendSMS();
$sent = $sms->sendMessageTest($data);
return response($sent);
}
public function getContacts()
{
$contacts = User::query()->value('phone');
return response()->json(['data' => $contacts]);
}
// NOVO CODIGO UPLOAD IMAGE
# actualizar no server
public function imageCompress($image, $newImageName, $imgDefaultRatio)
{
$image = \Image::make(file_get_contents($image));
$image->save($this->storagePath . '/' . $newImageName, $imgDefaultRatio);
}
#actualizar no server
public function imageUpload($image, $newImageName)
{
$image->move($this->storagePath, $newImageName);
}
# actualizar no server
public function generateImageUrl(Request $request, $imageAttr)
{
if ($request->hasFile($imageAttr) && $request->file($imageAttr)->isValid()) {
// Validar imagem
$this->validate(
$request,
[
$imageAttr => 'mimes:jpeg,jpg,png|max:4096'
],
[
'photo.required' => 'O campo photo é Obrigatório',
'photo.mimes' => 'Formato de imagem invalido, formatos permitidos jpeg,jpg,png',
'photo.max' => 'O tamanho de imagem permitido somente abaixo de 4 MB',
]
);
//fazer o upload
$image = $request[$imageAttr];
$newImageName = time() . $image->getClientOriginalName();
//verificar size
$imageSizeMB = round($request->file($imageAttr)->getSize() / (1024 * 1024), 2);
// Diminuir tamanho..
if ($imageSizeMB >= 1) {
$imgDefaultRatio = 65;
if ($imageSizeMB >= 3) {
$imgDefaultRatio = 35;
}
//comprimir e fazer upload
$this->imageCompress($image, $newImageName, $imgDefaultRatio);
} else {
$this->imageUpload($image, $newImageName);
}
// return $this->baseUrl . $newImageName;
return $newImageName; // todo -- actualizacao feita no dia 13 de Marco de 2025 ::. by Ivo Naftal
} else {
$exploded = explode(',', $request[$imageAttr]);
$decoded = base64_decode($exploded[$this->is_string_encoded($request[$imageAttr]) ? 0 : 1], True);
$f = finfo_open();
$mime_type = finfo_buffer($f, $decoded, FILEINFO_MIME_TYPE);
$valiExtension = ['jpeg', 'jpg', 'png'];
$imageExtention = substr($mime_type, 6, strlen($mime_type));
if (!in_array($imageExtention, $valiExtension)) return response()->json(['message' => "Formato de imagem invalido, formatos permitidos jpeg,jpg,png"], 400);
if ($this->getImageSizeMB($decoded) > 4) return response()->json(['message' => "O tamanho de imagem permitido somente abaixo de 4 MB"], 400);
// if (base64_encode($decoded) !== $exploded[$this->is_string_encoded($request[$imageAttr])?0:1]) return response()->json(['message' => 'Imagem invalida.'],400);
//faz o upload temporario no storage - by Rodrigues Mafumo
$tempFileName = $imageAttr . '.jpg';
if (Storage::put($tempFileName, $decoded)) {
$path = storage_path('app/') . $tempFileName;
$tempFile = new \Symfony\Component\HttpFoundation\File\File($path);
$file = UploadedFile::createFromBase(new UploadedFile($tempFile->getPathname(), $tempFileName, $tempFile->getMimeType(), null, true));
$newRequest = new Request();
$newRequest->files->set($imageAttr, $file);
return $this->generateImageUrl($newRequest, $imageAttr);
}
}
}
#server
private function getImageSizeMB($imagebase64)
{
$size_in_bytes = (int) (strlen(rtrim($imagebase64, '=')) * 1);
$size_in_kb = $size_in_bytes / 1024;
$size_in_mb = round($size_in_kb / 1024, 2);
return $size_in_mb;
}
#server
public function updateAvatar(Request $request)
{
$user = User::find($request->user()->id);
$posicao = strpos($user->photo, 'avatar') + 7;
//? Retorna a posicao do avatar
$imageName = substr($user->photo, $posicao, strlen($user->photo));
File::delete(public_path('/images/avatar/' . $imageName));
$photo = $this->generateImageUrl($request, 'photo');
if (!is_string($photo)) return $photo;
$user->photo = $photo;
$user->update();
return response()->json(['message' => 'Avatar Actualizado com Sucesso']);
}
#server
// Check if there are valid base64 characters
function is_string_encoded($s)
{
return !startsWith("data:image/", $s);
}
//FIM UPLOAD IMAGE
public function getMyCredelec(Request $request)
{
$size = (!request()->per_page) ? 4 : request()->per_page;
$new_start_date = null;
$new_end_date = null;
if ($request->filled('start_date')) {
$start_date = explode('-', $request->start_date);
if (strlen($start_date[2]) >= 4)
$new_start_date = $start_date[2] . '-' . $start_date[1] . '-' . $start_date[0];
}
if ($request->filled('end_date')) {
$end_date = explode('-', $request->end_date);
if (strlen($end_date[2]) >= 4)
$new_end_date = $end_date[2] . '-' . $end_date[1] . '-' . $end_date[0];
}
$credelec = Credelec::query()
->where('user_id', $request->user()->id)
// new ------------------------
->when($request->filled('start_date'), function ($query) use ($request, $new_start_date) {
$query->whereDate('credelecs.created_at', '>=', $new_start_date ?? $request->start_date);
})
->when($request->filled('end_date'), function ($query) use ($request, $new_end_date) {
$query->whereDate('credelecs.created_at', '<=', $new_end_date ?? $request->end_date);
})
// new ------------------------
->orderByDesc('created_at')
// ->get();
->paginate($size);
return response()->json($credelec, 200);
//return response()->json(['data' => $credelec]);
}
public function getMyWater(Request $request)
{
$size = (!request()->per_page) ? 4 : request()->per_page;
$new_start_date = null;
$new_end_date = null;
if ($request->filled('start_date')) {
$start_date = explode('-', $request->start_date);
if (strlen($start_date[2]) >= 4)
$new_start_date = $start_date[2] . '-' . $start_date[1] . '-' . $start_date[0];
}
if ($request->filled('end_date')) {
$end_date = explode('-', $request->end_date);
if (strlen($end_date[2]) >= 4)
$new_end_date = $end_date[2] . '-' . $end_date[1] . '-' . $end_date[0];
}
$credelec = Water::query()
->where('user_id', $request->user()->id)
// new ------------------------
->when($request->filled('start_date'), function ($query) use ($request, $new_start_date) {
$query->whereDate('waters.created_at', '>=', $new_start_date ?? $request->start_date);
})
->when($request->filled('end_date'), function ($query) use ($request, $new_end_date) {
$query->whereDate('waters.created_at', '<=', $new_end_date ?? $request->end_date);
})
// new ------------------------
->orderByDesc('created_at')
//->get();
->paginate($size);
return response()->json($credelec, 200);
//return response()->json(['data' => $credelec]);
}
public function pushNotifification($token, $notification = array(), $data = array())
{
$apiKey = 'AAAA8zVzEPQ:APA91bHl_DXB6UGb_6gZlmFnaLTQoANtX_OBjvl3nOy2bSlnFhxedvk6EhGj7cZoIvmlbKeCnqGxXbuyMH_rEPuhRXvuitXzo6Pfl2TMXLar1PlifXqEhYq6tS55UMrY2Kffzj-P_UH-';
$fields = array('to' => $token, 'notification' => $notification, 'data' => $data);
$headers = array('Authorization: key=' . $apiKey, 'Content-Type: application/json');
$url = 'https://fcm.googleapis.com/fcm/send';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($fields));
$result = curl_exec($curl);
curl_close($curl);
return json_decode($result, true);
}
//? Check User Name
public function checkUserName(Request $request)
{
$regex = "/^[a-zA-Z0-9]+(_{0,1})[a-zA-Z0-9]*$/";
if (!preg_match($regex, $request->username)) return response()->json(['message' => 'Username inválido, caracteres permitidos [ a-z ou A-Z ou 0-9 ou _ ]'], 400);
if (strlen($request->username) > 15) return response()->json(['message' => 'Username deve ter no maximo 15 caracteres'], 400);
$user = User::query()->where('username', $request->username)->first();
if ($user) return response()->json(['message' => 'Username já esta em uso'], 409);
return response()->json(['message' => 'Username disponivel'], 200);
}
//? Check Phone
public function checkUserPhone(Request $request)
{
// $regex = "/^[0-9]+$/";
$regex = "/^(82|83|84|85|86|87)+[0-9]{7,7}$/";
if (!preg_match($regex, $request->phone)) return response()->json(['message' => 'Número de telefone inválido'], 400);
$user = User::query()->where('phone', $request->phone)->first();
if ($user) return response()->json(['message' => 'Número de telefone já está em uso'], 409);
return response()->json(['message' => 'Numero de telefone disponivel'], 200);
}
//? Check Email
public function checkUserEmail(Request $request)
{
$this->validate(
$request,
[
'email' => 'required'
],
[
'email.required' => 'O campo email é Obrigatório',
]
);
// $regex = "/^[a-zA-Z0-9]+(_{0,1})[a-zA-Z0-9]*$/";
// $regex = "/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/";
$regex = "/^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i";
if (!preg_match($regex, $request->email)) return response()->json(['message' => 'Email inválido'], 400);
$user = User::query()->where('email', $request->email)->first();
if ($user) return response()->json(['message' => 'Email já esta em uso'], 409);
return response()->json(['message' => 'Email disponivel'], 200);
}
//? Update Username
public function updateUsername(Request $request)
{
// Validar imagem
$this->validate(
$request,
[
'username' => 'required|max:15'
],
[
'username.required' => 'O campo nome de utilizador é obrigatório',
]
);
$regex = "/^[a-zA-Z0-9]+(_{0,1})[a-zA-Z0-9]*$/";
if (!preg_match($regex, $request->username)) return response()->json(['message' => 'Nome de utilizador inválido, caracteres permitidos [ a-z ou A-Z ou 0-9 ou _ ]'], 400);
$user = User::query()->where('username', $request->username)->first();
if ($user) return response()->json(['message' => 'O nome de utilizador já está em uso.'], 409);
// return response()->json(['message'=> 'Username disponivel'], 200);
$user = $request->user();
if ($user) {
$update = User::query()
->where('id', $user->id)
->update([
'username' => $request->username
]);
if ($update) {
return response()->json(['message' => 'O nome de utilizador foi actualizado com sucesso.'], 200);
}
}
}
public function walletCSV()
{
return Excel::download(new Wallet, 'wallet.csv');
}
public function getWallets()
{
$wallets = Wallet::query()->get();
return response()->json(['data' => $wallets], 200);
}
public function createWithDrawalls(Request $request)
{
$request->request->add([
'mobile_wallets_id' => 21,
'phone' => $request->account_number,
'amount' => $request->amount,
'imaliReference' => User::getUserAccount()->reference
]);
$req = Request::create('/api/withdrawall-by-mpesa', 'POST', $request->all());
// return Route::dispatch($req);
// Dispatch the request to the application
$response = app()->handle($req);
// Get the content of the response
$content = $response->getContent();
// Optionally, convert JSON response to an array
$data = json_decode($content, true);
//$data2 = [
// 'account_number' => $data['phone'],
// 'account_type' => 'client',
// 'amount' => $data['amount'],
// 'wallets_id' => 2,
// 'operators_id' => 21,
// 'total' => $data['total'],
// 'imali_fee' => $data['imali_fee'],
// 'commission' => $data['commission'],
// 'bank_fee' => $data['bank_fee'],
// 'stamp_tax' => $data['stamp_tax'],
//];
return $data;
//verifica se pode efectuar a transacao
$checkWithDrawall = $this->checkWithdrawallTransaction($request);
if ($checkWithDrawall->getStatusCode() >= 400 && $checkWithDrawall->getStatusCode() < 500) return $checkWithDrawall->getData();
//verifica o PIN de confirmacao de transacoes
$auth = new Auth;
// $resp = $auth->checkUserPin($request);
$resp = $auth->checkUserPinAndFingerprint($request);
if ($resp->getStatusCode() >= 400 && $resp->getStatusCode() < 500) return $resp->getData();
//conta imali para pegar saldo anterior
$imali2 = ImaliAccount::query()->where('user_id', auth('api')->user()->id)->first();
//conta imali para pegar saldo actual
$imali = ImaliAccount::query()->where('user_id', auth('api')->user()->id)->first();
//variavel para colocar o nome do operador na descricao da transacao
$operator = Operator::query()->where('id', $checkWithDrawall->getData()->operators_id)->first();
//actualizacao do saldo principal e do saldo cativo
$imali->balance = $imali->balance - $checkWithDrawall->getData()->total;
$imali->captive_balance += $checkWithDrawall->getData()->total;
$imali->update();
/*variavel para pegar a conta imali de acordo com o account_type
* se o account_type for "client" entao vai buscar a conta iMali do cliente iMali
* se o account_type for "store" entao vai buscar a conta iMali da Loja
*/
$account_number = ImaliAccount::query()
->where('imali_accounts.user_id', auth('api')->user()->id)
->select('imali_accounts.balance', 'imali_accounts.account_number', 'imali_accounts.user_id')
->first()->account_number;
//regista o pedido de transferencia
$trasactionGeneration = new TransactionGeneration();
$transaction_id = $trasactionGeneration->generateTransaction();
$withdrawalls = WithdrawalsRequest::create([
'imali_account' => $account_number,
'account_type' => $request->account_type,
'amount' => $request->amount,
'imali_fee' => $checkWithDrawall->getData()->imali_fee,
'bank_fee' => $checkWithDrawall->getData()->bank_fee,
'description' => 'TRF. ' . $operator->acronym,
'account_number' => $request->account_number,
'wallets_id' => $request->wallets_id,
'operators_id' => $operator->id,
'status' => 'pending',
'old_balance' => $imali2->balance,
'new_balance' => $imali->balance,
'total' => $checkWithDrawall->getData()->total,
'transaction_id' => $transaction_id,
'commission' => $checkWithDrawall->getData()->commission,
'stamp_tax' => $checkWithDrawall->getData()->stamp_tax,
'user_id' => $imali->user_id,
'imali_account_id' => $imali->id
]);
//? -----------------INICIO---------------------
/**
* gerar um ficheiro excel de transacoes para enviar para o MOZA Banco
* Utilizando template localizado em storage/app/template.csv
* Salvando em storage/app/downloads
* */
$data = new \App\Exports\WalletExport();
// return $data->collection();
$date = date('Y') . date('m') . date('d');
$hours = date('H') . date('i') . date('s');
$fileName = "Transac_iMali_" . $date . "-" . $hours . '.csv';
$this->generateMozaTransactionFile($data, $fileName);
//encryptar o ficheiro e enviar no diretorio do moza banco
$this->encryptGeneratedFileAndSendToMoza($fileName);
//actualizar o status da transacao para pending
// $withdrawalls->status = 'pending';
// $withdrawalls->update();
return response()->json(['message' => 'Pedido de transferência efectuado com sucesso!'], 200);
}
private function generateMozaTransactionFile($data, $fileName)
{
file_put_contents(storage_path('/app/template/' . $fileName), file_get_contents(storage_path('/app/template/template.csv')));
$file = fopen(storage_path('/app/template/' . $fileName), 'a') or die('unable to open file');
foreach ($data->collection() as $key => $value) {
$text = $value['value' . $key] . "\n";
fwrite($file, $text);
}
fclose($file);
rename(storage_path('/app/template/' . $fileName), storage_path('/app/downloads/' . $fileName));
}
private function encryptGeneratedFileAndSendToMoza($fileName)
{
$filePath = "/downloads/" . $fileName;
$uploadPath = storage_path('app' . $filePath);
$filePath = str_replace('\\', '/', $uploadPath);
//ENCRIPTAR FICHEIRO
$commands = explode(",", "gpg --homedir /home/paytek/.gnupg --recipient einstein.bata@mozabanco.co.mz --encrypt " . $filePath . "," . "mv " . $filePath . ".gpg" . " /var/sftp/uploads_mozabanco/imali_transac_files/" . $fileName . ".gpg");
// $commands = explode(",", "gpg --homedir /home/paytek/.gnupg --recipient lourino.junior@mozabanco.co.mz --encrypt " . $filePath . "," . "mv " . $filePath . ".gpg" . " /var/sftp/uploads_mozabanco/imali_transac_files/" . $fileName . ".gpg");
foreach ($commands as $command) {
exec($command, $output, $returnDir);
}
}
public function checkWithdrawallTransaction(Request $request)
{
//return response()->json(['message' => 'Serviço temporariamente indisponível.'], 400);
$request->request->add([
'mobile_wallets_id' => 21,
'phone' => $request->account_number,
'amount' => $request->amount,
'imaliReference' => User::getUserAccount()->reference
]);
$req = Request::create('/api/check-mpesa-withdrawall-transaction', 'GET', $request->all());
// $req = Request::create('/api/check/mpesa/b2c-transaction', 'GET');
// return Route::dispatch($req);
// Dispatch the request to the application
$response = app()->handle($req);
if ($response->getStatusCode() != 200) return $response;
// Get the content of the response
$content = $response->getContent();
Log::info('[LOG_TEST_CONTENT_WITHDRAWAL]', ['data' => $response->getStatusCode()]);
// Optionally, convert JSON response to an array
$data = json_decode($content, true);
$data2 = [
'account_number' => $data['phone'],
'account_type' => 'client',
'amount' => $data['amount'],
'wallets_id' => 2,
'operators_id' => 21,
'total' => $data['total'],
'imali_fee' => $data['imali_fee'],
//'bank_fee' => $data['bank_fee'],
'commission' => $data['commission'],
'stamp_tax' => $data['stamp_tax'],
];
//return $data2;
return response()->json($data2, 200);
//return $data;
//?return response()->json(['message'=> 'Feito com sucesso'], 201);
// return response()->json(['message' => 'Este serviço vai estar disponível a partir do dia 1 de Outubro.'], 400);
// return response()->json(['message' => 'Este serviço está disponível somente para ambiente em Produção.'], 400);
$this->validate(
$request,
[
'account_type' => 'required|in:client',
'amount' => 'required',
'wallets_id' => 'required',
],
[
'account_type.required' => 'O campo account_type é obrigatório',
'account_type.in' => 'O campo account_type só pode ser (client)',
'amount.required' => 'Campo amount é obrigatório',
'wallets_id.required' => 'Campo wallets_id é obrigatório',
]
);
//? validacao
// $rules = [
// 'account_type' => 'required|in:client',
// 'amount' => 'required',
// 'wallets_id' => 'required',
// ];
// $messages = [
// 'account_type.required' => 'O campo account_type é obrigatório',
// 'account_type.in' => 'O campo account_type só pode ser (client)',
// 'amount.required' => 'Campo amount é obrigatório',
// 'wallets_id.required' => 'Campo wallets_id é obrigatório',
// ];
// $fail = Validator::make($request->all(), $rules, $messages);
//if ($fail->fails()) return response()->json(['errors' => $fail->errors()], 400);
//? validacao
$wallets = Wallet::query()->where('id', $request->wallets_id)->first();
if (!$wallets) return response()->json(['message' => 'Opção de transferência inválida'], 400);
if ($request->wallets_id == 2) {
$this->validate(
$request,
[
'account_number' => 'required|numeric|digits:9',
],
[
'account_number.required' => 'Campo telefone é obrigatório',
'account_number.numeric' => 'Campo telefone é numérico',
'account_number.digits' => 'Campo telefone deve ter 9 digitos',
]
);
// $rules = [
// 'account_number' => 'required|numeric|digits:9',
// ];
// $messages = [
// 'account_number.required' => 'Campo telefone é obrigatório',
// 'account_number.numeric' => 'Campo telefone é numérico',
// 'account_number.digits' => 'Campo telefone deve ter 9 digitos',
// ];
// $fail = Validator::make($request->all(), $rules, $messages);
// if ($fail->fails()) return response()->json(['errors' => $fail->errors()], 400);
$regex = "/^(82|83|84|85|86|87)+[0-9]{7,7}$/";
if (!preg_match($regex, $request->account_number)) return response()->json(['message' => 'Número de telefone inválido'], 400);
$operator = Operator::query()->where('code', 'LIKE', '%' . substr($request->account_number, 0, 2) . '%')->first();
if (!$operator) return response()->json(['message' => 'Número de telefone inválido'], 400);
}
if ($request->wallets_id == 1) {
$this->validate(
$request,
[
'account_number' => 'required|numeric|digits:21',
],
[
'account_number.required' => 'Campo NIB é obrigatório',
'account_number.numeric' => 'Campo NIB é númerico',
'account_number.digits' => 'Campo NIB deve ter 21 digitos',
]
);
//$rules = [
// 'account_number' => 'required|numeric|digits:21',
// ];
// $messages = [
// 'account_number.required' => 'Campo NIB e obrigatorio',
// 'account_number.numeric' => 'Campo NIB e numerico',
// 'account_number.digits' => 'Campo NIB deve ter 21 digitos',
//];
// $fail = Validator::make($request->all(), $rules, $messages);
// if ($fail->fails()) return response()->json(['errors' => $fail->errors()], 400);
$ibanToValidate = "MZ59" . $request->account_number;
if (!$this->validateIBAN($ibanToValidate)) return response()->json(['message' => 'Número de NIB inválido'], 400);
$operator = Operator::query()->where('code', 'LIKE', '%' . substr($request->account_number, 0, 4) . '%')->first();
if (!$operator) return response()->json(['message' => 'Número de NIB inválido'], 400);
if ($operator->code !== '0034') return response()->json(['message' => 'Serviço de Transferencias interbancária indisponivel. Caso tenha uma conta MOZA tente novamente com o teu NIB MOZA'], 400);
}
//? validate amount
//if (!is_numeric($request->amount)) return response()->json(['message' => 'Montante inválido'], 400);
// verificacao do nivel de KYC.
// $kyc = new UserKyc(auth()->user()->id);
$user = User::getUserDetails(auth()->user()->id);
$kyc = new UserKyc($user);
$kycResp = $kyc->checkUserKYC($request->amount);
if ($kycResp->getStatusCode() == 400) return $kycResp;
// verificacao do nivel de KYC.
//if ($request->amount < 0) return response()->json(['message' => 'Montante inválido'], 400);
if ($request->wallets_id == 1) {
if ($operator->code == '0034') { //intrabancaria
$walletsFee = WalletFee::query()
->where('id', 1)
->where('wallets_id', $request->wallets_id)
->first();
} else { //interbancaria
$walletsFee = WalletFee::query()
->where('id', 2)
->where('wallets_id', $request->wallets_id)
->first();
}
if (!$walletsFee) return response()->json(['message' => 'Operação não pode ser processada'], 400);
} else {
$walletsFee = WalletFee::query()
->where('wallets_id', $request->wallets_id)
->where('min_amount', '<=', $request->amount)
->where('max_amount', '>=', $request->amount)
->first();
if (!$walletsFee) return response()->json(['message' => 'Montante inválido'], 400);
}
// verificar saldo da conta iMali que esta a fazer a transferencia..
//$user = auth('api')->user();
//$imali_account = ImaliAccount::query()->where('user_id', $user->id)->first();
$total = $request->amount + $walletsFee->imali_fee;
// Limitando o valor para duas casas decimais
$total = number_format($total, 2, '.', '');
$total = floatval($total);
$kycRespBalance = $kyc->checkUserBalance($total);
if ($kycRespBalance->getStatusCode() == 400) return $kycRespBalance;
//if($imali_account->balance < $total) return response()->json(['message' => 'Saldo insuficiente'], 400);
// verificar nivel de KYC se lhe compete fazer essa transferencia..
//if(($imali_account->imali_account_config == 1) && ($request->amount > 300)) return response()->json(['message' => 'O seu nível de KYC não permite fazer a transação'], 400);
if ($request->wallets_id == 1) {
$data = [
'account_number' => $request->account_number,
'account_type' => $request->account_type,
'amount' => $request->amount,
'wallets_id' => $request->wallets_id,
'operators_id' => $operator->id,
'total' => $total,
'imali_fee' => $walletsFee->imali_fee,
'commission' => $walletsFee->commission,
'bank_fee' => $walletsFee->bank_fee,
'stamp_tax' => $walletsFee->stamp_tax
];
return response()->json($data, 200);
} else {
$data = [
'account_number' => $request->account_number,
'account_type' => $request->account_type,
'amount' => $request->amount,
'wallets_id' => $request->wallets_id,
'operators_id' => $operator->id,
'total' => $total,
'imali_fee' => $walletsFee->imali_fee,
'commission' => $walletsFee->commission,
'bank_fee' => $walletsFee->bank_fee,
'stamp_tax' => $walletsFee->stamp_tax
];
return response()->json($data, 200);
}
}
function validateIBAN($iban)
{
// Remover espaços e caracteres não numéricos do IBAN
$iban = preg_replace('/\s+/', '', $iban);
// Verificar se o IBAN tem o comprimento correto para Moçambique (25 caracteres)
if (strlen($iban) !== 25) {
return false;
}
// Mover os primeiros 4 caracteres para o final do IBAN
$iban = substr($iban, 4) . substr($iban, 0, 4);
// Substituir letras por números (A=10, B=11, ..., Z=35)
$ibanNumeric = '';
foreach (str_split($iban) as $char) {
if (ctype_alpha($char)) {
$ibanNumeric .= ord(strtoupper($char)) - ord('A') + 10;
} else {
$ibanNumeric .= $char;
}
}
// Verificar se o IBAN é divisível por 97
if (bcmod($ibanNumeric, '97') !== '1') {
return false;
}
return true;
}
public function checkNIB(Request $request)
{
$this->validate(
$request,
[
'account_number' => 'required|numeric|digits:21',
],
[
'account_number.required' => 'Campo NIB é obrigatório',
'account_number.numeric' => 'Campo NIB é númerico',
'account_number.digits' => 'Campo NIB deve ter 21 digitos',
]
);
//$rules = [
// 'account_number' => 'required|numeric|digits:21',
// ];
// $messages = [
// 'account_number.required' => 'Campo NIB e obrigatorio',
// 'account_number.numeric' => 'Campo NIB e numerico',
// 'account_number.digits' => 'Campo NIB deve ter 21 digitos',
// ];
// $fail = Validator::make($request->all(), $rules, $messages);
// if ($fail->fails()) return response()->json(['errors' => $fail->errors()], 400);
if (!$this->validateIBAN("MZ59" . $request->account_number)) return response()->json(['message' => 'NIB inválido'], 400);
return response()->json(['message' => 'NIB válido'], 200);
}
//? reset PIN
public function resetPIN(Request $request)
{
//
// $user = User::where('email', $request->email)->orWhere('username', $request->email)->first();
$user = User::where('email', $request->email)->first();
$messageError = "O email não foi encontrado!";
if (!$user) if ($request->wantsJson()) {
// return JSON-formatted response
return response()->json(['message' => $messageError], 404);
} else {
// return HTML response
return view('email-not-found', compact('messageError'));
}
// return response()->json(['message' => $messageError], 404);
$validate = EmailValidation::query()->where('email', $request->email)->first();
// $user = User::query()->where('email', $request->email)->first();
$token = $user->createToken('TokenName')->accessToken;
$convert = strtotime(date('Y-m-d H:i:s')) + (60 * 10);
$duration = date("Y-m-d H:i:s", $convert);
if (!$validate) {
EmailValidation::create([
'email' => $request->email,
'codigo' => $token,
'is_Validate' => 0,
'duration' => $duration
]);
} else {
$validate->duration = $duration;
$validate->codigo = $token;
$validate->status = 'active';
$validate->update();
}
try {
//code...
Mail::to($user->email)->send(new ResetPinEmail($user, $token));
$message = "Foi enviado um email para a tua caixa de correio eletrônico. Clique no link enviado para redefinir o teu PIN";
if ($request->wantsJson()) {
// return JSON-formatted response
return response()->json(['message' => $message], 200);
} else {
// return HTML response
return view('email-sent', compact('message'));
}
} catch (\Throwable $th) {
//throw $th;
$message = "O teu Email não foi enviado";
if ($request->wantsJson()) {
// return JSON-formatted response
return response()->json(['message' => $message], 400);
} else {
// return HTML response
return view('email-not-sent', compact('message'));
}
}
// return response()->json(['message' => 'definir-pin'.$token], 200);
// return response()->json(['message' => 'Email enviado com sucesso'], 200);
}
public function definirPin($token)
{
// Verifique se o token é válido (você precisará implementar esta lógica)
// $user = User::where('pin_reset_token', $token)->first();
$user = EmailValidation::where('codigo', $token)->first();
if (!$user) return response()->json(['message' => 'token invalido'], 400);
$is_expired = strtotime($user->duration) - strtotime(date('Y-m-d H:i:s'));
if ($is_expired < 0) {
$user->status = 'expired';
$user->update();
$message = "Token Expirado";
return view('email-not-sent', compact('message'));
}
$errors = Validator::make([], [])->errors();
// Passe o usuário e o token para a view
return view('definir-pin', compact('user', 'token', 'errors'));
}
public function salvarPin(Request $request)
{
// $request->validate([
// 'new_pin' => ['required', new PinValidation],
// 'confirm_new_pin' => ['required', new PinValidation],
// ]);
$rules = [
'new_pin' => 'required|max:4|same:confirm_new_pin',
'confirm_new_pin' => 'required|max:4',
];
$messages = [
'new_pin.required' => 'O PIN é Obrigatório',
'confirm_new_pin.required' => 'O Campo Confirmar PIN é Obrigatório',
'new_pin.same' => 'Senhas incompatíveis',
'new_pin.max' => 'A PIN deve ter 4 digitos no maximo',
'confirm_new_pin.max' => 'A PIN deve ter 4 digitos no maximo'
];
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
// $errors = Arr::flatten($validator->messages()->toArray());
// return response()->json(['state' => 412, 'message' => $errors], 200);
// return Redirect::back()->with($errors);
// $errors=$errors;
// dd($token);
// return Redirect::route('definir-pin', [$request->token])->with($validator->);
// return to_route('definir-pin',[$request->token])->withErrors();
// return Redirect::back()->withInput();
return back()->with(['errors', $validator->errors()]);
// return view('definir-pin', compact('token'))->with('errors', $errors);
}
// return $request->token;
// $this->validate(
// $request,
// [
// 'new_pin' => ['required|max:4|same:confirm_new_pin'],
// 'confirm_new_pin' => 'required|max:4',
// ],
// [
// 'new_pin.required' => 'O PIN é Obrigatório',
// 'confirm_new_pin.required' => 'O Campo Confirmar PIN é Obrigatório',
// 'new_pin.same' => 'Senhas incompatíveis',
// 'new_pin.max' => 'A PIN deve ter 4 digitos no maximo',
// 'confirm_new_pin.max' => 'A PIN deve ter 4 digitos no maximo'
// ]
// );
// if ($validator->fails()) {
// return Redirect::back()->withErrors($validator);
// }
// $user = User::where('pin_reset_token', $token)->first();
$user = EmailValidation::where('codigo', $request->token)->first();
// return $user;
if (!$user) return response()->json(['message' => 'token invalido....'], 400);
if ($user->status === 'expired') return response()->json(['message' => 'Token expirado'], 400);
$userFinal = User::where('email', $user->email)->first();
//Salve o novo PIN
$userFinal->update([
'pin' => Hash::make($request->confirm_new_pin),
]);
$convert = strtotime(date('Y-m-d H:i:s')) - (60 * 10);
$duration = date("Y-m-d H:i:s", $convert);
$user->update([
'is_Validated' => 1,
'status' => 'used',
'duration' => $duration
]);
//$user->update([
// 'is_Validated' => 1,
// 'status' => 'used',
// 'duration' => date('Y-m-d H:i:s') - (60*5)
//]);
//$user->is_Validated = 1;
//$user->status = 'used';
//$user->duration = date('Y-m-d H:i:s') - (60 * 5);
//$user->save();
// Redirecione para a página de sucesso ou qualquer outra página desejada
// return redirect()->route('pagina-de-sucesso');
// return response()->json(['message' => 'Pin redefinido com sucesso'], 200);
$message = "O seu PIN foi redefinido com sucesso";
// return view('email-sent', compact('message'));
if ($request->wantsJson()) {
// return JSON-formatted response
return response()->json(['message' => $message], 200);
} else {
// return HTML response
// return view('email-not-sent', compact('message'));
// $message = "O seu PIN foi redefinido com sucesso";
return view('email-sent', compact('message'));
}
}
public function checkContact(Request $request)
{
$this->validate(
$request,
[
'phone' => 'required|numeric|digits:9',
],
[
// 'phone.required' => 'Campo Phone é obrigatório',
// 'phone.numeric' => 'Campo Phone é númerico',
// 'phone.digits' => 'Campo Phone deve ter 9 digitos',
'phone.required' => 'Número telefone é obrigatório',
'phone.numeric' => 'Número telefone é númerico',
'phone.digits' => 'Número de telefone deve ter 9 digitos',
]
);
//$phone_exist = UserRechargPhone::query()->where('phone', $request->phone)->first();
$phone_exist = UserRechargPhone::query()->where('phone', $request->phone)->where('user_id', auth('api')->user()->id)->first();
if ($phone_exist) return response()->json(['message' => "Este contacto já está em uso!"], 400);
$prefix = substr($request->phone, 0, 2);
if ($prefix == 84 || $prefix == 85) {
$phones = UserRechargPhone::query()->where('user_id', auth('api')->user()->id)->where('operator_name', 'vodacom')->count();
if ($phones == 3) return response()->json(['message' => "Atingiu o limite de contactos para a operadora Vodacom"], 400);
}
if ($prefix == 82 || $prefix == 83) {
$phones = UserRechargPhone::query()->where('user_id', auth('api')->user()->id)->where('operator_name', 'tmcel')->count();
if ($phones == 3) return response()->json(['message' => "Atingiu o limite de contactos para a operadora Tmcel"], 400);
}
if ($prefix == 86 || $prefix == 87) {
$phones = UserRechargPhone::query()->where('user_id', auth('api')->user()->id)->where('operator_name', 'movitel')->count();
if ($phones == 3) return response()->json(['message' => "Atingiu o limite de contactos para a operadora Movitel"], 400);
}
return $this->resendCode($request);
}
public function addContact(Request $request)
{
$this->validate(
$request,
[
'token' => 'required|numeric|digits:6',
],
[
'token.required' => 'Campo token é obrigatório',
'token.numeric' => 'Campo token é númerico',
'token.digits' => 'Campo token deve ter 6 digitos',
]
);
$phone = PhoneValidation::query()->where('codigo', $request->token)->first();
if (!$phone) return response()->json(['message' => "Token invalido"], 404);
$is_expired = strtotime($phone->expire_at) - strtotime(date('Y-m-d H:i:s'));
if ($is_expired < 0) return response()->json(['message' => "Token expirado"], 404);
$operator_name = '';
$prefix = substr($phone->phone, 0, 2);
if ($prefix == 84 || $prefix == 85)
$operator_name = 'vodacom';
else if ($prefix == 82 || $prefix == 83)
$operator_name = 'tmcel';
else if ($prefix == 86 || $prefix == 87)
$operator_name = 'movitel';
else
$operator_name = 'desconhecido';
UserRechargPhone::create([
'operator_name' => $operator_name,
'phone' => $phone->phone,
'user_id' => auth('api')->user()->id
]);
$convert = strtotime(date('Y-m-d H:i:s')) - (60 * 10);
$duration = date("Y-m-d H:i:s", $convert);
$phone->is_Validated = 1;
$phone->expire_at = $duration;
$phone->update();
return response()->json(['message' => "Contacto adicionado com sucesso!!"], 200);
}
public function removeContact(Request $request)
{
$this->validate(
$request,
[
'phone' => 'required|numeric|digits:9',
],
[
// 'phone.required' => 'Campo Phone é obrigatório',
// 'phone.numeric' => 'Campo Phone é númerico',
// 'phone.digits' => 'Campo Phone deve ter 9 digitos',
'phone.required' => 'Número telefone é obrigatório',
'phone.numeric' => 'Número telefone é númerico',
'phone.digits' => 'Número de telefone deve ter 9 digitos',
]
);
$phone_validation = PhoneValidation::query()->where('phone', $request->phone)->first();
if (!$phone_validation) return response()->json(['message' => "Contacto invalido"], 404);
$phone = UserRechargPhone::query()->where('phone', $request->phone)->where('user_id', auth('api')->user()->id)->first();
if (!$phone) return response()->json(['message' => "Contacto nao encontrado"], 404);
try {
//code...
$phone_validation->delete();
$phone->delete();
return response()->json(['message' => 'Contacto removido com sucesso.'], 200);
} catch (\Throwable $th) {
//throw $th;
return response()->json(['message' => 'Nao foi possivel remover o seu contacto'], 500);
}
}
public function getMyConctacts()
{
$phones = UserRechargPhone::query()
->orderBy('user_recharg_phones.created_at', 'desc')
->select('user_recharg_phones.*')
->where('user_id', auth('api')->user()->id)
->get();
return response()->json(['data' => $phones], 200);
}
public function checkDefaultNumber(Request $request)
{
$this->validate(
$request,
[
'phone' => 'required|numeric|digits:9',
],
[
'phone.required' => 'Campo Phone é obrigatório',
'phone.numeric' => 'Campo Phone é númerico',
'phone.digits' => 'Campo Phone deve ter 9 digitos',
]
);
$user_total = User::query()->where('phone', $request->phone)->count();
if ($user_total > 0) return response()->json(['message' => "Este contacto está em uso!"], 404);
return $this->resendCode($request);
}
public function changeDefaultNumber(Request $request)
{
$this->validate(
$request,
[
'token' => 'required|numeric|digits:6',
],
[
'token.required' => 'Campo token é obrigatório',
'token.numeric' => 'Campo token é númerico',
'token.digits' => 'Campo token deve ter 6 digitos',
]
);
$phone = PhoneValidation::query()->where('codigo', $request->token)->first();
if (!$phone) return response()->json(['message' => "Token invalido"], 400);
$is_expired = strtotime($phone->expire_at) - strtotime(date('Y-m-d H:i:s'));
if ($is_expired < 0) return response()->json(['message' => "Token expirado"], 400);
$user = User::query()->where('id', auth('api')->user()->id)->first();
$user->phone = $phone->phone;
$phone2 = PhoneValidation::query()->where('phone', auth('api')->user()->phone)->first();
if ($phone2) $phone2->forceDelete();
$convert = strtotime(date('Y-m-d H:i:s')) - (60 * 10);
$duration = date("Y-m-d H:i:s", $convert);
$phone->expire_at = $duration;
$phone->is_Validated = 1;
$phone->update();
$user->update();
return response()->json(['message' => "Contacto actualizado"], 200);
}
public function createSubAccounts2024(Request $request)
{
// return "Chegou";
$this->validate(
$request,
[
'name' => 'required',
'sub_account_types_id' => 'required',
],
[
'name.required' => 'Campo name é obrigatório',
'sub_account_types_id.required' => 'Campo sub_account_types_id é obrigatório',
]
);
// todo -------------------teste de criacao de conta
// Verificar o limite de subcontas que podem ser criadas
$userAuth = User::getUserDetails(auth()->user()->id);
$nr_subaccounts = ImaliSubAccount::where('main_account_number', $userAuth->account_number)
->get()->count();
$last_subaccount = ImaliSubAccount::where('main_account_number', $userAuth->account_number)
->orderBy('id', 'desc')->first();
if ($nr_subaccounts != 0) {
$last_subaccount_len = (int)strlen($last_subaccount->account_number);
if ($nr_subaccounts >= 9 || $last_subaccount_len > 9) return response()->json(['message' => 'Atingui o limite de subcontas.'], 404);
}
// todo -------------------teste de criacao de conta
if ($request->store_account_number) {
// Buscar a loja onde se fara o pagamento
$store_account = Store::getStoreAccount($request->store_account_number);
// return $store_account;
if (!$store_account) return response()->json(['message' => 'Comerciante invalido'], 400);
}
// if ($request->has('has_card_associated') && $request->has_card_associated) {
// $this->validate(
// $request,
// [
// 'card_number' => 'required|unique:imali_sub_accounts',
// ],
// [
// 'card_number.required' => 'Campo card_number é obrigatório',
// 'card_number.unique' => 'Campo card_number ja existe',
// ]
// );
// }
// Obter detalhes do usuário autenticado
// ->get(['account_number'])
// ->pluck('account_number');
$account_generator = new GenerateImaliAccount();
$newSubaccount = $account_generator->generateSubImaliAccount2024();
return $newSubaccount;
// Buscar dados do User que faz a transacao
$userAuth = User::getUserDetails(auth()->user()->id);
// Buscar dados da conta do User que faz a transacao
$imaliAccount = User::getAccountByUser($userAuth->id, $userAuth->account_id);
// tabela de iMaliSubAccount
$imaliSubAccount = new ImaliSubAccount();
$imaliSubAccount->name = $request->name;
$imaliSubAccount->account_number = $newSubaccount;
$imaliSubAccount->sub_account_types_id = $request->sub_account_types_id;
$imaliSubAccount->user_id = $userAuth->id;
$imaliSubAccount->main_account_id = $imaliAccount->id;
$imaliSubAccount->main_account_number = $imaliAccount->account_number;
if ($request->store_account_number)
$imaliSubAccount->store_id = $store_account->id;
// if ($request->has('has_card_associated') && $request->has_card_associated) {
// $imaliSubAccount->card_number = $request->card_number;
// $imaliSubAccount->has_card_associated = $request->has_card_associated;
// }
// Verifica se o campo card_number foi preenchido
if ($request->filled('card_number')) {
$sub_account = ImaliSubAccount::query()->where('card_number', $request->card_number)->first();
if ($sub_account) return response()->json(['message' => 'Este número de cartão já está associado a uma conta.'], 400);
$imaliSubAccount->card_number = $request->card_number;
$imaliSubAccount->has_card_associated = 1;
}
try {
$imaliSubAccount->save();
return response()->json(['message' => 'SubConta criada com sucesso!'], 200);
} catch (\Exception $e) {
return response()->json(['message' => 'Erro ao salvar' . $e], 500);
}
}
public function createSubAccounts(Request $request)
{
$this->validate(
$request,
[
'name' => 'required',
'sub_account_types_id' => 'required',
],
[
'name.required' => 'Campo name é obrigatório',
'sub_account_types_id.required' => 'Campo sub_account_types_id é obrigatório',
]
);
// Verificar o limite de subcontas que podem ser criadas
$userAuth = User::getUserDetails(auth()->user()->id);
$nr_subaccounts = ImaliSubAccount::where('main_account_number', $userAuth->account_number)
->get()->count();
$last_subaccount = ImaliSubAccount::where('main_account_number', $userAuth->account_number)
->orderBy('id', 'desc')->first();
if ($nr_subaccounts != 0) {
$last_subaccount_len = (int)strlen($last_subaccount->account_number);
if ($nr_subaccounts >= 9 || $last_subaccount_len > 9) return response()->json(['message' => 'Atingiu o limite de subcontas.'], 404);
}
// todo -------------------teste de criacao de conta
if ($request->store_account_number) {
// Buscar a loja onde se fara o pagamento
$store_account = Store::getStoreAccount($request->store_account_number);
// return $store_account;
if (!$store_account) return response()->json(['message' => 'Comerciante invalido'], 400);
}
//if ($request->has('has_card_associated') && $request->has_card_associated) {
// $this->validate(
// $request,
// [
// 'card_number' => 'required|unique:imali_sub_accounts',
// ],
// [
// 'card_number.required' => 'Campo card_number é obrigatório',
// 'card_number.unique' => 'Campo card_number ja existe',
// ]
// );
// }
$account_generator = new GenerateImaliAccount();
$newSubaccount = $account_generator->generateSubImaliAccount();
// Buscar dados do User que faz a transacao
$userAuth = User::getUserDetails(auth()->user()->id);
// Buscar dados da conta do User que faz a transacao
$imaliAccount = User::getAccountByUser($userAuth->id, $userAuth->account_id);
// tabela de iMaliSubAccount
$imaliSubAccount = new ImaliSubAccount();
$imaliSubAccount->name = $request->name;
$imaliSubAccount->account_number = $newSubaccount;
$imaliSubAccount->sub_account_types_id = $request->sub_account_types_id;
$imaliSubAccount->user_id = $userAuth->id;
$imaliSubAccount->main_account_id = $imaliAccount->id;
$imaliSubAccount->main_account_number = $imaliAccount->account_number;
if ($request->store_account_number)
$imaliSubAccount->store_id = $store_account->id;
//if ($request->has('has_card_associated') && $request->has_card_associated) {
// $imaliSubAccount->card_number = $request->card_number;
// $imaliSubAccount->has_card_associated = $request->has_card_associated;
//}
$sub_account_type = SubAccountType::find($request->sub_account_types_id);
if ($sub_account_type && $sub_account_type->type_id === 'NFC_CARD') {
$this->validate(
$request,
[
'card_number' => 'required|unique:imali_sub_accounts',
'store_account_number' => 'required',
],
[
'card_number.required' => 'Número de cartão é obrigatório',
'card_number.unique' => 'Número de cartão já existe',
'store_account_number.required' => 'O campo número de conta de comerciante é obrigatório',
]
);
$sub_account = ImaliSubAccount::query()->where('card_number', $request->card_number)->first();
if ($sub_account) return response()->json(['message' => 'Este número de cartão já está associado a uma conta.'], 400);
$imaliSubAccount->card_number = $request->card_number;
$imaliSubAccount->has_card_associated = 1;
$imaliSubAccount->is_credit_allowed = 1;
$imaliSubAccount->is_debit_allowed = 0;
} else if ($sub_account_type && $sub_account_type->type_id === 'BNPL') {
$imaliSubAccount->is_credit_allowed = 0;
$imaliSubAccount->is_debit_allowed = 0;
}
// Verifica se o campo card_number foi preenchido
//if ($request->filled('card_number')) {
// $sub_account = ImaliSubAccount::query()->where('card_number', $request->card_number)->first();
// if ($sub_account) return response()->json(['message' => 'Este número de cartão já está associado a uma conta.'], 400);
// $imaliSubAccount->card_number = $request->card_number;
// $imaliSubAccount->has_card_associated = 1;
// }
try {
$imaliSubAccount->save();
return response()->json(['message' => 'SubConta criada com sucesso!'], 200);
} catch (\Exception $e) {
return response()->json(['message' => 'Erro ao salvar' . $e], 500);
}
}
public function createSubAccountsTypes(Request $request)
{
$this->validate(
$request,
[
'name' => 'required',
'short_description' => 'required',
'long_description' => 'required',
],
[
'name.required' => 'Campo name e obrigatorio',
'short_description.required' => 'Campo short_description e obrigatorio',
'long_description.required' => 'Campo long_description e obrigatorio',
]
);
$sub_account = new SubAccountType();
$sub_account->name = $request->name;
$sub_account->short_description = $request->short_description;
$sub_account->long_description = $request->long_description;
$sub_account->type_id = $request->type_id;
$sub_account->name_en = $request->name_en;
$sub_account->short_description_en = $request->short_description_en;
$sub_account->long_description_en = $request->long_description_en;
if ($sub_account) {
try {
$sub_account->save();
return response()->json(['message' => 'Adicionado com sucesso!'], 200);
} catch (\Exception $e) {
return response()->json(['message' => 'Erro ao salvar'], 500);
}
} else {
return response()->json(['message' => 'Nao pode registar os dados informados ja estao em uso'], 400);
}
}
public function deleteSubAccounts(Request $request)
{
$this->validate(
$request,
[
'account_number' => 'required',
],
[
'account_number.required' => 'Campo account_number é obrigatório',
]
);
$sub_account = ImaliSubAccount::query()->where('account_number', $request->account_number)->first();
if (!$sub_account) return response()->json(['message' => 'Conta não encontrada.'], 400);
/* dados da subconta */
// return response()->json(['data' => $sub_account], 200);
// $imaliaccount_has_adr = SubAccountDeletionRequest::query()->where('account_number', $request->account_number)->first();
// if ($imaliaccount_has_adr) return response()->json(['message' => 'A subconta ' . $request->account_number . ', já efectuou um pedido de cancelamento.'], 400);
// if ($sub_account->balance >= 1 || $sub_account->captive_balance >= 1) {
// SubAccountDeletionRequest::create([
// 'account_number' => $request->account_number,
// 'main_account_number' => $sub_account->main_account_number,
// 'user_id' => auth('api')->user()->id
// ]);
// $sub_account->status = 0;
// $sub_account->update();
// return response()->json(['message' => 'Pedido de exclusão de subconta foi enviado com sucesso!'], 200);
//}
if ($sub_account->balance > 0) return response()->json(['message' => 'Não é possível excluir a tua subconta imali, pois ainda tem saldo disponível.'], 400);
// if ($sub_account->captive_balance > 0) return response()->json(['message' => 'Não é possível excluir a tua subconta imali, pois tens transaçõs por serem concluídas.'], 400);
// Validar o PIN e Fingerprint do userPayer
$auth = new Auth();
$authResp = $auth->checkUserPinAndFingerprint($request);
if ($authResp->getStatusCode() != 200) return $authResp;
if ($sub_account) $sub_account->delete();
return response()->json(['message' => 'Conta removida com sucesso.'], 200);
}
public function updateSubAccounts(Request $request, $account_number)
{
$sub_account = ImaliSubAccount::query()->where('account_number', $account_number)->first();
if (!$sub_account) return response()->json(['message' => 'Subconta não encontrada.'], 400);
//$subAccountCard = ImaliSubAccount::query()->where('card_number', $request->card_number)->first();
$subAccountCard = ImaliSubAccount::query()->where('card_number', $request->card_number)->where('account_number', '!=', $account_number)->first();
// Verifica se o card_number foi informado e se já existe um sub_account com o mesmo card_number
if ($request->filled('card_number') && $subAccountCard) {
// return redirect()->route('sua_rota')->with('error', 'Já existe uma conta associada a este número de cartão.');
return response()->json(['message' => 'Já existe uma conta associada a este número de cartão.'], 400);
}
// Se o card_number foi informado, atualiza o sub_account
if ($request->filled('card_number')) {
$sub_account->card_number = $request->card_number;
}
// Atualiza outros campos, como o nome
$sub_account->name = $request->filled('name') ? $request->name : $sub_account->name;
// Verifica se o campo card_number foi preenchido
if ($request->filled('card_number')) {
$sub_account->has_card_associated = 1;
}
$sub_account->update();
return response()->json(['message' => 'Dados da subconta alterados com sucesso.'], 200);
}
public function getSubAccounts()
{
// $userAuth = User::getUserDetails(auth()->user()->id);
// // return $userAuth->balance;
// $subaccounts = ImaliSubAccount::query()->where('imali_account_id', $userAuth->account_number)->get();
// return $subaccounts;
$userAuth = User::getUserDetails(auth()->user()->id);
// $subaccounts = ImaliAccount::query()->where('imali_account_id', $userAuth->account_number)->get();
// $subaccounts = ImaliSubAccount::query()->where('imali_account_id', $userAuth->account_number)->get();
//ORIGINAL
// $subaccounts = ImaliSubAccount::query()->where('main_account_number', $userAuth->account_number)->get();
// trazer resultados de $subaccounts mesmo quando store_id for igual a null,
// você pode usar uma cláusula leftJoin em vez de join. Isso garantirá que
// todas as linhas da tabela ImaliSubAccount sejam retornadas, independentemente
// de haver uma correspondência na tabela stores.
$subaccounts = ImaliSubAccount::query()
->leftJoin('stores', 'stores.id', '=', 'imali_sub_accounts.store_id')
->select('imali_sub_accounts.*', 'stores.account_number as store_account_number')
->where('imali_sub_accounts.main_account_number', $userAuth->account_number)
->get();
//$subaccounts = ImaliSubAccount::query()
// ->join('stores', 'stores.id', 'store_id')
// ->select('imali_sub_accounts.*', 'stores.account_number as store_account_number')
// ->where('main_account_number', $userAuth->account_number)
// ->get();
// Adicionar o balance principal na query com um nome diferente para cada item em $subaccounts
$subaccountsWithBalance = $subaccounts->map(function ($subaccount) use ($userAuth) {
$subaccount->main_balance = $userAuth->balance;
return $subaccount;
});
return response()->json(['data' => $subaccountsWithBalance], 200);
}
public function getSubAccountsTypes()
{
$subaccounts = SubAccountType::all();
//return $subaccounts;
return response()->json(['data' => $subaccounts], 200);
}
public function getSubAccountsTransactionsOLD()
{
$userAuth = User::getUserDetails(auth()->user()->id);
$subaccounts = ImaliSubAccount::query()->where('main_account_number', $userAuth->account_number)->first();
$card = $subaccounts->card_number;
$transaction = Payment::query()
->join('stores', 'stores.id', 'payments.store_id')
->where('sender_card_number', $card)
->select(
'payments.id',
'transaction_id',
'amount',
'estado',
DB::raw("'Pagamento' as description"),
'payment_type',
'sender_name',
'sender_account_number',
'sender_card_number',
'store_id',
'stores.name as store_name',
'payments.status',
'payments.created_at',
'payments.updated_at'
)->get();
//return $transaction;
return response()->json(['data' => $transaction], 200);
}
// Transacoes das subcontas
public function getSubAccountsTransactions_SERVER(Request $request)
{
$size = (!request()->per_page) ? 4 : request()->per_page;
$userAuth = User::getUserDetails(auth()->user()->id);
$subaccounts = ImaliSubAccount::query()
->where('main_account_number', $userAuth->account_number)
->get();
$accountNumbers = $subaccounts->pluck('account_number')->toArray();
$subConta = ImaliSubAccount::query()
->where('account_number', $request->subaccount_number)
->first();
if (!$subConta) return response()->json(['message' => 'A subconta informada não foi encontrada.'], 400);
// Obter transações normais
$payments = Payment::query()
->join('stores', 'stores.id', 'payments.store_id')
->whereIn('sender_account_number', $accountNumbers)
->orWhere('sender_account_number', $subConta->account_number)
->select(
'payments.id',
'transaction_id',
'amount',
'transaction_type',
'transaction_name',
'estado',
'payment_type',
'sender_name',
'sender_account_number',
'sender_card_number',
'store_id',
'stores.name as store_name',
'payments.status',
'payments.created_at',
'payments.updated_at'
);
//->get();
$transfers = Transfer::query()
->join('transfer_histories', 'transfer_histories.transaction_id', '=', 'transfers.transaction_id')
->whereIn('sender_account', $accountNumbers)
->orWhere(function ($query) use ($userAuth, $subConta) {
$query->where('sender_account', '=', $userAuth->account_number)
->where('reciever_account', '=', $subConta->account_number);
})
->orWhere(function ($query) use ($subConta, $userAuth) {
$query->where('sender_account', '=', $subConta->account_number)
->where('reciever_account', '=', $userAuth->account_number);
})
->select(
'transfer_histories.id',
'transfer_histories.transaction_id',
'transfer_histories.amount',
'transfer_histories.transaction_type',
'transfer_histories.transaction_name',
'transfer_histories.estado',
'transfers.sender_id',
'transfers.sender_name',
'transfers.sender_account',
'transfers.reciever_id',
'transfers.reciever_name',
'transfers.reciever_account',
'transfers.status',
'transfer_histories.created_at',
'transfer_histories.updated_at'
);
//->get();
// Unir os resultados de $transfers e $payments
//$allData = $payments->concat($transfers);
$allData = $payments->union($transfers)->paginate($size);
return response()->json($allData, 200);
//return response()->json(['data' => $allData], 200);
}
// NOVO METODO
public function getMyTransactionSubAccount(Request $request)
{
// $size = $request->per_page ?? 100;
$size = (!request()->per_page) ? 100 : request()->per_page;
if (!User::is_subAccount($request->subaccount_number)) return response()->json(['data' => []], 400);
// Verificar se a subconta fornecida existe
$subConta = ImaliSubAccount::where('account_number', $request->subaccount_number)->first();
if (!$subConta) return response()->json(['data' => []], 400);
$sub_account_type = SubAccountType::where('id', $subConta->sub_account_types_id)->first();
if ($sub_account_type && $sub_account_type->type_id == 'NFC_CARD') {
$myPayments = $this->getMySubAccountPayments($subConta, $size);
return response()->json($myPayments, 200);
} else if ($sub_account_type && $sub_account_type->type_id == 'BNPL') {
$myPayments = $this->getSubAccountKRBPayments($subConta, $size);
return response()->json($myPayments, 200);
} else {
// Transferencia
$myTransfers = $this->getMySubAccountTransfers($subConta, $size);
return response()->json($myTransfers, 200);
}
}
private function getMySubAccountPayments($subConta, $size)
{
$payments = Payment::join('stores', 'stores.id', 'payments.store_id')
->where('sender_card_number', $subConta->card_number)
->where('payments.created_at', '>=', $subConta->created_at)
->orderByDesc('payments.created_at')
->select([
'payments.id',
'transaction_id',
'amount',
'transaction_type',
'transaction_name',
'estado',
'payment_type',
'sender_name',
'sender_account_number',
'sender_card_number',
'store_id',
'stores.name as store_name',
DB::raw(
"CASE WHEN payments.status = 'success' THEN 'Sucesso'
WHEN payments.status = 'pending' THEN 'Pendente'
WHEN payments.status = 'completed' THEN 'Concluído'
WHEN payments.status = 'failed' THEN 'Falhou'
ELSE payments.status END as status"
),
'payments.created_at',
'payments.updated_at'
]);
return $payments->orderByDesc('created_at')->paginate($size);
}
public function getSubAccountKRBPayments999($subConta, $size)
{
// Definir o tamanho padrão da página se não especificado
// $size = $request->per_page ?? 5;
// Verificar se a subconta fornecida existe
return $subConta = ImaliSubAccount::where('account_number', $subConta)->first();
if (!$subConta) {
return SendResponse::errorResp404notfound('Número de conta inválido', 'Invalid Account Number');
}
$sub_account_type = SubAccountType::query()->where('id', $subConta->sub_account_types_id)->first();
if ($sub_account_type === null || $sub_account_type->type_id != 'BNPL') {
return SendResponse::errorResp400('Tipo de conta inválido', 'Invalid Account Type');
}
// Obter transações normais
$payments = Payment::join('stores', 'stores.id', 'payments.store_id')
->where('sender_account_number', $subConta->subaccount_number)
->where('payments.created_at', '>=', $subConta->created_at)
->orderByDesc('payments.created_at')
->select([
'payments.id',
'transaction_id',
'amount',
DB::raw("'Pagamento' as transaction_type"),
DB::raw("'Pagamento normal' as transaction_name"),
'sender_name',
'sender_account_number',
DB::raw("CASE WHEN payments.status = 'success' THEN 'Sucesso'
WHEN payments.status = 'pending' THEN 'Pendente'
WHEN payments.status = 'completed' THEN 'Concluído'
WHEN payments.status = 'failed' THEN 'Falhou'
ELSE payments.status END as status"),
'payments.created_at',
'payments.updated_at'
]);
// Obter recargas
$recharge = RechargeImaliAccount::query()
->join('users', 'users.id', 'recharge_imali_accounts.user_id')
->where('account_reference', $subConta)
->where('recharge_imali_accounts.created_at', '>=', $subConta->created_at)
->select([
'recharge_imali_accounts.id',
'transaction_id',
'amount',
DB::raw("'Recarga' as transaction_type"),
DB::raw("'Recarga iMali' as transaction_name"),
'recharge_way',
'users.name as sender_name',
'account_reference as sender_account_number',
'recharge_imali_accounts.estado as status',
'recharge_imali_accounts.created_at',
'recharge_imali_accounts.updated_at'
]);
// Unir os dados e aplicar paginação
$allData = $payments->union($recharge)->orderByDesc('created_at')->paginate($size);
return SendResponse::successResp200(['data' => $allData]);
}
// Get Account Transactions - KRB
public function getSubAccountKRBPayments($subConta, $size)
{
// return $subConta->account_number;
$payments = Payment::join('stores', 'stores.id', 'payments.store_id')
->where('sender_account_number', $subConta->account_number)
->where('payments.created_at', '>=', $subConta->created_at)
->orderByDesc('payments.created_at')
->select([
'payments.id',
'transaction_id',
'amount',
'transaction_type',
'transaction_name',
'sender_name',
'sender_account_number',
DB::raw(
"CASE WHEN payments.status = 'success' THEN 'Sucesso'
WHEN payments.status = 'pending' THEN 'Pendente'
WHEN payments.status = 'completed' THEN 'Concluído'
WHEN payments.status = 'failed' THEN 'Falhou'
ELSE payments.status END as status"
),
'payments.created_at',
'payments.updated_at'
]);
$recharge = RechargeImaliAccount::query()
->join('users', 'users.id', 'recharge_imali_accounts.user_id')
->where('account_reference', $subConta->account_number)
->where('recharge_imali_accounts.created_at', '>=', $subConta->created_at)
->select([
'recharge_imali_accounts.id',
'transaction_id',
'amount',
'recharge_way as transaction_type',
'description as transaction_name',
'users.name as sender_name',
'account_reference as sender_account_number',
'recharge_imali_accounts.estado as status',
'recharge_imali_accounts.created_at',
'recharge_imali_accounts.updated_at'
]);
$payments->union($recharge)->orderByDesc('created_at')->paginate($size);
return $payments->orderByDesc('created_at')->paginate($size);
}
private function getMySubAccountTransfers($sub_account, $size)
{
$transfers = TransferHistory::query()
->join('transfers', 'transfers.transaction_id', '=', 'transfer_histories.transaction_id')
//->where('user_id', $sub_account_id)
->where('transfers.created_at', '>=', $sub_account->created_at)
->where(auth()->user()->id == $sub_account->id ? 'transfer_histories.sender_account' : 'transfer_histories.user_id', auth()->user()->id == $sub_account->id ? $sub_account->account_number : $sub_account->id)
->select([
'transfer_histories.id',
'transfer_histories.transaction_id',
'transfer_histories.amount',
'transfer_histories.transaction_type',
'transfer_histories.transaction_name',
'transfer_histories.estado',
'transfers.sender_id',
'transfers.sender_name',
'transfers.sender_account',
DB::raw('NULL as sender_account'),
DB::raw('NULL as reciever_name'),
DB::raw('NULL as reciever_account'),
DB::raw(
"CASE WHEN transfers.status = 'sucess' THEN 'Sucesso'
WHEN transfers.status = 'pending' THEN 'Pendente'
WHEN transfers.status = 'completed' THEN 'Concluído'
WHEN transfers.status = 'failed' THEN 'Falhou'
ELSE transfers.status END as status"
),
'transfer_histories.created_at',
'transfer_histories.updated_at'
]);
return $transfers->orderBy('transfer_histories.created_at', 'desc')->paginate($size);
}
// Transacoes das subcontas NEW CODE 11-April-2024
public function getSubAccountsTransactions(Request $request)
{
Log::info('Outgoing Response', [
'content' => $request->url(),
'params' => $request->all(),
]);
// Definir o tamanho padrão da página se não especificado
$size = $request->per_page ?? 50;
// Obter detalhes do usuário autenticado
$userAuth = User::getUserDetails(auth()->user()->id);
// Obter subcontas associadas ao usuário autenticado
$subaccounts = ImaliSubAccount::where('main_account_number', $userAuth->account_number)
->get(['account_number'])
->pluck('account_number');
// Verificar se a subconta fornecida existe
$subConta = ImaliSubAccount::where('account_number', $request->subaccount_number)
->first();
if (!$subConta) {
return response()->json(['message' => 'A subconta informada não foi encontrada.'], 400);
}
// Obter transações normais
$payments = Payment::join('stores', 'stores.id', 'payments.store_id')
//->whereIn('sender_account_number', $subaccounts)
//->orWhere('sender_account_number', $subConta->account_number)
->where('sender_account_number', $request->subaccount_number)
->orWhere('sender_card_number', $request->subaccount_number)
->orderByDesc('payments.created_at')
->select([
'payments.id',
'transaction_id',
'amount',
'transaction_type',
'transaction_name',
'estado',
'payment_type',
'sender_name',
'sender_account_number',
'sender_card_number',
'store_id',
'stores.name as store_name',
//'payments.status',
DB::raw(
"CASE WHEN payments.status = 'success' THEN 'Sucesso'
WHEN payments.status = 'pending' THEN 'Pendente'
WHEN payments.status = 'completed' THEN 'Concluído'
WHEN payments.status = 'failed' THEN 'Falhou'
ELSE payments.status END as status"
),
'payments.created_at',
'payments.updated_at'
]);
// Obter transferências
// $transfers = Transfer::join('transfer_histories', 'transfer_histories.transaction_id', '=', 'transfers.transaction_id')
// ->whereIn('sender_account', $subaccounts)
// ->orWhere(function ($query) use ($userAuth, $subConta) {
// $query->where('sender_account', $userAuth->account_number)
// ->where('reciever_account', $subConta->account_number);
// })
// ->orWhere(function ($query) use ($subConta, $userAuth) {
// $query->where('sender_account', $subConta->account_number)
// ->where('reciever_account', $userAuth->account_number);
// })
// return $sub_account_id;
// CODIGO MIGUEL CUMBE
$sub_account_id = ImaliSubAccount::query()
->where('account_number', $request->subaccount_number)
->select('id')
->first();
$transfers = Transfer::leftJoin('transfer_histories', 'transfer_histories.transaction_id', '=', 'transfers.transaction_id')
//$transfers = Transfer::join('transfer_histories', 'transfer_histories.transaction_id', '=', 'transfers.transaction_id')
// ->where(function ($query) use ($request, $subConta) {
// $query->where('sender_account', $request->subaccount_number)
// ->orWhere('reciever_account', $request->subaccount_number)
// ->orWhere(function ($query) use ($subConta) {
// $query->where('sender_account', $subConta->account_number)
// ->orWhere('reciever_account', $subConta->account_number);
// });
// })
->where(function ($query) use ($request, $subConta, $sub_account_id, $userAuth) {
$query->where('sender_account', $request->subaccount_number)->where('user_id', $sub_account_id)
->orWhere('reciever_account', $request->subaccount_number)->where('client_id', $userAuth->id)
->orWhere(function ($query) use ($subConta, $userAuth, $sub_account_id) {
$query->where('sender_account', $subConta->account_number)->where('client_id', $userAuth->id)
->orWhere('reciever_account', $subConta->account_number)->where('user_id', $sub_account_id);
});
})
// ->where(function ($query) use ($sub_account_id, $userAuth) {
// $query->where('user_id', $sub_account_id)
// ->orWhere(
// function ($query) use ($userAuth) {
// $query->where('client_id', $userAuth->id);
// }
// );
// })
->orderByDesc('transfer_histories.created_at')
->select([
'transfer_histories.id',
'transfer_histories.transaction_id',
'transfer_histories.amount',
'transfer_histories.transaction_type',
'transfer_histories.transaction_name',
'transfer_histories.estado',
'transfers.sender_id',
'transfers.sender_name',
// 'transfers.sender_account',
// 'transfers.reciever_id',
'transfers.sender_account',
DB::raw('NULL as sender_account'),
// 'transfers.reciever_name',
DB::raw('NULL as reciever_name'),
DB::raw('NULL as reciever_account'),
// 'transfers.reciever_account',
//'transfers.status',
DB::raw(
"CASE WHEN transfers.status = 'sucess' THEN 'Sucesso'
WHEN transfers.status = 'pending' THEN 'Pendente'
WHEN transfers.status = 'completed' THEN 'Concluído'
WHEN transfers.status = 'failed' THEN 'Falhou'
ELSE transfers.status END as status"
),
'transfer_histories.created_at',
'transfer_histories.updated_at'
]);
// ->select([
// 'transfer_histories.id',
// 'transfer_histories.transaction_id',
// 'transfer_histories.amount',
// 'transfer_histories.transaction_type',
// 'transfer_histories.transaction_name',
// 'transfer_histories.estado',
// 'transfers.sender_id',
// 'transfers.sender_name',
// 'transfers.sender_account',
// 'transfers.reciever_id',
// 'transfers.reciever_name',
// 'transfers.reciever_account',
// 'transfers.status',
// 'transfer_histories.created_at',
// 'transfer_histories.updated_at'
// ]);
// Unir e paginar os resultados
$allData = $payments->union($transfers)->orderByDesc('created_at')->paginate($size);
return response()->json($allData, 200);
}
public function addMoneySubAccount(Request $request)
{
$this->validate(
$request,
[
'amount' => 'required',
],
[
'amount.required' => 'Campo amount e obrigatorio',
]
);
// Buscar dados do User que faz a transacao
// $userPayer = User::getUserDetails(auth()->user()->id);
$userPayer = User::getUserAccount();
//return $userPayer;
// Buscar dados da conta principal
$accountPayerMainAccount = User::getAccountByUser($userPayer->id, $userPayer->account_id);
//return $accountPayerMainAccount;
// Buscar dados da subconta
$accountPayerOld = User::getAccount($request->account_number);
$accountPayer = User::getAccount($request->account_number);
//return $accountPayer;
if (!$accountPayer->is_credit_allowed) return SendResponse::errorResp400(
'Crédito na subconta não permitido',
'Subaccount credit not allowed',
);
try {
DB::beginTransaction();
// Validar o PIN e Fingerprint do userPayer
$auth = new Auth();
$authResp = $auth->checkUserPinAndFingerprint($request);
if ($authResp->getStatusCode() != 200) return $authResp;
if ($accountPayerMainAccount->balance < $request->amount) return response()->json(['message' => 'O saldo disponivel é menor do que o valor solicitado.'], 400);
if ($accountPayerMainAccount->balance === 0 && $request->amount > 0) return response()->json(['message' => 'Não é possível realizar a operação. O saldo da conta é zero.'], 400);
$accountPayer->balance += $request->amount;
$accountPayer->update();
$accountPayerMainAccount->balance -= $request->amount;
$accountPayerMainAccount->update();
// ----------------------------------------------------
// Registar a transacao de transferencia | Envio de Dinheiro
$random = new TransactionGeneration();
$transactionReference = $random->generateTransaction();
$transferencia = Transfer::create([
'transaction_id' => $transactionReference,
'sender_id' => $accountPayerMainAccount->id,
'sender_account' => $accountPayerMainAccount->account_number,
'sender_name' => $userPayer->name,
'reciever_id' => $accountPayer->id,
'reciever_name' => $accountPayer->name,
'reciever_account' => $accountPayer->account_number,
'amount' => $request->amount,
'total_amount' => $request->amount,
'comissao' => 0,
'estado_color' => '#388E3C',
'estado' => 'Pago',
'status' => 'sucess',
'description' => 'TRF. Main Account to Sub Account',
'amount_debited' => $request->amount,
'imali_transac_type' => 'TRANSAC_C2C_TRANSFERENCIA',
'old_balance' => $accountPayerOld->balance,
'new_balance' => $accountPayer->balance
]);
$senderHistory = TransferHistory::create([
'transaction_id' => $transactionReference,
'sender_account' => $accountPayerMainAccount->account_number,
'reciever_account' => $accountPayer->account_number,
'user_id' => $accountPayerMainAccount->id,
'client_id' => $accountPayer->id,
'amount' => $request->amount,
'comissao' => 0,
'estado_color' => '#388E3C',
'estado' => 'Pago',
'user_status' => 'payer',
'amount_debited' => $request->amount,
'transaction_type' => 'debit',
'transaction_name' => 'Transferência'
]);
$receiverHistory = TransferHistory::create([
'transaction_id' => $transactionReference,
'sender_account' => $accountPayer->account_number,
'reciever_account' => $accountPayerMainAccount->account_number,
'user_id' => $accountPayer->id,
'client_id' => $accountPayerMainAccount->id,
'amount' => $request->amount,
'description' => $request->description,
'comissao' => 0,
'estado_color' => '#388E3C',
'estado' => 'Recebido',
'user_status' => 'receiver',
'amount_debited' => $request->amount,
'transaction_type' => 'credit',
'transaction_name' => 'Transferência'
]);
TransactionHistory::create([
'user_id' => $senderHistory->user_id,
'transfer_history_id' => $senderHistory->id,
'transaction_type' => 'transfer_history'
]);
TransactionHistory::create([
'user_id' => $receiverHistory->user_id,
'transfer_history_id' => $receiverHistory->id,
'transaction_type' => 'transfer'
]);
// ----------------------------------------------------
DB::commit();
return response()->json([
'message' => 'Transferência feita com sucesso!',
'transaction' => $transactionReference,
'created_at' => $transferencia->created_at
], 200);
} catch (\Throwable $th) {
DB::rollBack();
// Escrever no ficheiro de log as mensagens de erro.
return response()->json(['message' => 'Falha na operação', $th->getMessage()], 500);
}
}
public function removeMoneySubAccount(Request $request)
{
//$req = Request::create('/api/mine-transaction-store-2024', 'POST', $request->all());
//return Route::dispatch($req);
$this->validate(
$request,
[
'amount' => 'required',
],
[
'amount.required' => 'Campo amount e obrigatorio',
]
);
// Buscar dados do User que faz a transacao
$userPayer = User::getUserDetails(auth()->user()->id);
// return $userPayer;
// Buscar dados da conta principal
$accountPayerMainAccount = User::getAccountByUser($userPayer->id, $userPayer->account_id);
// return $accountPayerMainAccount;
$accountPayerMainAccountOld = User::getAccountByUser($userPayer->id, $userPayer->account_id);
// Buscar dados da subconta
$accountPayer = User::getAccount($request->account_number);
// return $accountPayer;
if (!$accountPayer) return SendResponse::errorResp404notfound(
'Subconta não encontrada',
'Subaccount not found',
);
// return $accountPayer;
if (!$accountPayer->is_debit_allowed) return SendResponse::errorResp400(
'Dédito na subconta não permitido',
'Subaccount debit not allowed',
);
// $kyc = new UserKyc($accountPayer);
// $kycSenderResp = $kyc->checkSenderKYC($request->amount);
// if ($kycSenderResp->getStatusCode() != 200) return $kycSenderResp;
try {
DB::beginTransaction();
// Validar o PIN e Fingerprint do userPayer
$auth = new Auth();
$authResp = $auth->checkUserPinAndFingerprint($request);
if ($authResp->getStatusCode() != 200) return $authResp;
if ($accountPayer->balance < $request->amount) return response()->json(['message' => 'O saldo disponivel é menor do que o valor solicitado.'], 400);
// if ($accountPayer->balance === 0 && $request->amount > 0) return response()->json(['message' => 'Não é possível realizar a operação. O saldo da conta é zero.'], 400);
$accountPayer->balance -= $request->amount;
$accountPayer->update();
$accountPayerMainAccount->balance += $request->amount;
$accountPayerMainAccount->update();
// ----------------------------------------------------
// Registar a transacao de transferencia | Envio de Dinheiro
$random = new TransactionGeneration();
$transactionReference = $random->generateTransaction();
$transferencia = Transfer::create([
'transaction_id' => $transactionReference,
'sender_id' => $accountPayer->id,
'sender_account' => $accountPayer->account_number,
'sender_name' => $accountPayer->name,
'reciever_id' => $accountPayerMainAccount->id,
'reciever_name' => $userPayer->name,
'reciever_account' => $accountPayerMainAccount->account_number,
'amount' => $request->amount,
'total_amount' => $request->amount,
'comissao' => 0,
'estado_color' => '#388E3C',
'estado' => 'Pago',
'status' => 'sucess',
'description' => 'TRF. Sub Account to Main Account',
'amount_debited' => $request->amount,
'imali_transac_type' => 'TRANSAC_C2C_TRANSFERENCIA',
'old_balance' => $accountPayerMainAccountOld->balance,
'new_balance' => $accountPayerMainAccount->balance
]);
$senderHistory = TransferHistory::create([
'transaction_id' => $transactionReference,
'sender_account' => $accountPayerMainAccount->account_number,
'reciever_account' => $accountPayer->account_number,
'user_id' => $accountPayer->id,
'client_id' => $accountPayerMainAccount->id,
'amount' => $request->amount,
'comissao' => 0,
'estado_color' => '#388E3C',
'estado' => 'Pago',
'user_status' => 'payer',
'amount_debited' => $request->amount,
'transaction_type' => 'debit',
'transaction_name' => 'Transferência',
]);
$receiverHistory = TransferHistory::create([
'transaction_id' => $transactionReference,
'sender_account' => $accountPayer->account_number,
'reciever_account' => $accountPayerMainAccount->account_number,
'user_id' => $accountPayerMainAccount->id,
'client_id' => $accountPayer->id,
'amount' => $request->amount,
'description' => $request->description,
'comissao' => 0,
'estado_color' => '#388E3C',
'estado' => 'Recebido',
'user_status' => 'receiver',
'amount_debited' => $request->amount,
'transaction_type' => 'credit',
'transaction_name' => 'Transferência',
]);
TransactionHistory::create([
'user_id' => $senderHistory->user_id,
'transfer_history_id' => $senderHistory->id,
'transaction_type' => 'transfer_history'
]);
TransactionHistory::create([
'user_id' => $receiverHistory->user_id,
'transfer_history_id' => $receiverHistory->id,
'transaction_type' => 'transfer'
]);
// ----------------------------------------------------
DB::commit();
return response()->json([
'message' => 'Transferência feita com sucesso!',
'transaction' => $transactionReference,
'created_at' => $transferencia->created_at
], 200);
} catch (\Throwable $th) {
DB::rollBack();
// Escrever no ficheiro de log as mensagens de erro.
return response()->json(['message' => 'Falha na operação', $th->getMessage()], 500);
}
}
public function removeSubAccountMoney(Request $request)
{
// $userAuth = User::getUserDetails(auth()->user()->id);
// $accountSender = ImaliAccount::query()->where('imali_account_id', $userAuth->account_number)->get();
// Buscar dados do User que faz a transacao
$userSender = User::getUserDetails(auth()->user()->id);
// Buscar dados da conta do User que faz a transacao
$accountSender = User::getAccountByUser($userSender->id, $userSender->account_id);
return $accountSender;
$userReceiver = User::getUserDetails(User::getAccount($request->account_number)->user_id);
$accountReceiver = User::getAccountByUser($userReceiver->id, $userReceiver->account_id);
}
public function tvcaboCheckClient(Request $request)
{
try {
$response = Http::get('http://localhost:3004/api/tvcabo/check-client-invoice?NContrato=' . $request->client_number);
return response()->json($response);
} catch (\Throwable $th) {
return response()->json($th->getMessage());
}
}
public function getUserToken($phone)
{
$config = PhoneValidation::query()
->select('phone', 'codigo', 'duration', 'expire_at', 'is_Validated')
->where('phone', $phone)
->first();
if ($config) {
// Hora atual e expiração (sem Carbon)
$now = time();
$expire = strtotime($config->expire_at);
if ($now > $expire) {
$status = 'TOKEN EXPIRADO';
$tempoRestante = '0 segundos';
} else {
$status = 'TOKEN VÁLIDO';
$diff = $expire - $now; // diferença em segundos
// Converter para minutos e segundos
$min = floor($diff / 60);
$sec = $diff % 60;
if ($min > 0) {
$tempoRestante = "{$min} minutos e {$sec} segundos";
} else {
$tempoRestante = "{$sec} segundos";
}
}
return response()->json([
'phone' => $config->phone,
'codigo' => $config->codigo,
'duration' => $config->duration,
'expire_at' => $config->expire_at,
'is_Validated' => $config->is_Validated,
'status' => $status,
'tempo_restante' => $tempoRestante,
]);
}
return response()->json(['message' => 'OTP não encontrado.'], 400);
}
public function switchLang(Request $request)
{
$this->validate(
$request,
[
'lang' => 'required|in:PT,EN,ES,FR',
],
[
'lang.required' => 'Campo de Idioma obrigatório',
'lang.in' => 'Os idiomas validos são: PT, EN, ES, FR',
]
);
$auth_user = User::getUserDetails(auth()->user()->id);
if ($auth_user->lang === $request->lang) return response()->json(['message' => 'O idioma selecionado já esta em uso'], 200);
$auth_user->lang = $request->lang;
$auth_user->update();
return response()->json(['message' => 'Idioma actualizado com sucesso'], 200);
}
}