File: /var/www/vaspayment.com/app/Http/Controllers/AirtimeController.php
<?php
namespace App\Http\Controllers;
use App\Models\Key;
use App\Models\Wallet;
use App\Models\Referrals;
use App\Models\Transaction;
use Illuminate\Http\Request;
use App\Models\WalletHistory;
use App\Models\AirtimeCommission;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Validator;
class AirtimeController extends Controller
{
private function baseUrl()
{
return config('app.honour_world');
}
private function header()
{
$email = config('app.mail');
$token = Key::where('email', $email)->value('live_key');
$headers = [
"Authorization" => "Bearer " . $token,
"Accept" => "application/json",
"Content-Type" => "application/json",
];
return $headers;
}
public function __construct()
{
if (config('app.verification') == true) {
$this->middleware(['auth', 'verified']);
} else {
$this->middleware(['auth']);
}
}
public function buyAirtime(Request $request)
{
// Validate the request data
$validator = Validator::make($request->all(), [
'network' => 'required|string',
'phone' => 'required|string|regex:/^\d{11}$/',
'amount' => 'required|string',
]);
if ($validator->fails()) {
return redirect()->back()->with('error', $validator->errors()->first());
}
$validated = $validator->validated();
// Extract request data
$network = $validated['network'];
$phone = $validated['phone'];
$amount = str_replace(',', '', $validated['amount']);
// Now $cleanedAmount contains the amount without commas
$user = auth()->user();
$user_id = $user->id;
// Check if the user wallet balance is sufficient
$userBalance = $user->wallet->balance;
if ($userBalance < $amount) {
return redirect()->route('fund.index')->with('error', 'Insufficient fund. Kindly fund your wallet to proceed!');
}
// Prepare API request body
$body = [
'network' => $network,
'phone' => $phone,
'amount' => $amount,
];
try {
// API request to buy airtime
$response = Http::withHeaders($this->header())->post($this->baseUrl() . '/api/v2/airtime/buy', $body);
$info = $response->json();
if ($info['data']['code'] == 200) {
// Deduct the amount from the user's wallet
$userWallet = $user->wallet;
$userWallet->balance -= $amount;
$userWallet->save();
// get parameters
$reference = $info['data']['reference'];
$code = $info['data']['code'];
$description = $info['msg'];
$newBalance = $amount - $userBalance; //Get current balance of the user
// Save to Wallet History
$walletHistory = new WalletHistory();
$walletHistory->previous_balance = $userBalance;
$walletHistory->current_balance = $newBalance;
$walletHistory->amount = $amount;
$walletHistory->transaction_id = $reference;
$walletHistory->transaction_type = "Airtime Purchase";
$walletHistory->user_id = $user->id;
$walletHistory->save();
// Add commission to the user
$airtime = AirtimeCommission::where('network', $network)->first();
if ($airtime) {
$commissionPercentage = $airtime->commission / 100;
$newCommission = $commissionPercentage * $amount;
$userWallet->commission += $newCommission;
$userWallet->save();
} else {
$newCommission = 0.50;
$userWallet->commission += $newCommission;
$userWallet->save();
}
// Check if the user has not done a transaction before
$hasNotDoneTransaction = !Transaction::where('user_id', $user->id)->exists();
// User has not done a transaction before
if ($hasNotDoneTransaction) {
// Find the referral record where the referree_id matches the user's wallet_id and status is 0
$referral = Referrals::where('referral_id', $user->wallet_id)->where('status', 0)->first();
if ($referral) {
$referreeWallet = Wallet::where('wallet_id', $referral->referree_id)->first();
if ($referreeWallet) {
$referreeWallet->commission += 20;
$referreeWallet->save();
// Update the referral record to mark it as credited
$referral->status = 1;
$referral->save();
} else {
info('record of wallet id not found');
}
} else {
info('bonus given already');
}
}
// Save the transaction to the database
$transaction = new Transaction([
'reference' => $reference,
'amount' => $amount,
'status' => $code,
'type' => 'Airtime',
'network' => $network,
'commission' => $newCommission,
'destination' => $description,
'user_id' => $user_id,
]);
$transaction->save();
return redirect()->back()->with('status', $info['msg']);
} else {
$errorMessages = '';
foreach ($info['error'] as $error) {
$errorMessage = $error['msg'];
$errorMessages .= $errorMessage . ' '; // You can adjust the format as needed
}
return redirect()->back()->with('error', $errorMessages);
}
} catch (\Throwable $th) {
return redirect()->back()->with('error', $info['error'][0]['msg']);
}
}
public function airtimeList()
{
$commission = AirtimeCommission::latest()->get();
return view('dashboard.agent.products.airtime.commission', compact('commission'));
}
public function storeCommission(Request $request)
{
$request->validate([
'network' => 'required',
'commission' => 'required',
'cash_back' => 'sometimes',
'phone' => 'sometimes',
]);
$airtimeCommission = new AirtimeCommission;
$airtimeCommission->network = $request->get('network');
$airtimeCommission->commission = $request->get('commission');
$airtimeCommission->cash_back = $request->get('cash_back');
$airtimeCommission->status = $request->get('status');
$airtimeCommission->phone = $request->get('phone');
$airtimeCommission->save();
return redirect()->back()->with('status', 'Commission Added');
}
public function updateCommission(Request $request, AirtimeCommission $airtimeCommission)
{
$request->validate([
'network' => 'required',
'commission' => 'required',
'status' => 'required',
'cash_back' => 'sometimes',
'phone' => 'sometimes',
]);
$airtimeCommission->network = $request->input('network');
$airtimeCommission->commission = $request->input('commission');
$airtimeCommission->cash_back = $request->input('cash_back');
$airtimeCommission->status = $request->input('status');
$airtimeCommission->phone = $request->input('phone');
$airtimeCommission->save();
return redirect()->back()->with('status', 'Updated Successfully');
}
public function deleteCommission(AirtimeCommission $airtimeCommission)
{
$airtimeCommission->delete();
return redirect()->back()->with('status', 'Deleted Successfully');
}
public function getCommission(Request $request)
{
$selectedNetwork = $request->input('network');
// Fetch commission data based on the selected network
$commissionData = AirtimeCommission::where('network', $selectedNetwork)->first();
return response()->json([
'phone' => $commissionData->phone ?? null,
'cash_back' => $commissionData->cash_back ?? 0,
]);
}
}