GOOD SHELL MAS BOY
Server: Apache/2.4.52 (Ubuntu)
System: Linux vmi1836763.contaboserver.net 5.15.0-130-generic #140-Ubuntu SMP Wed Dec 18 17:59:53 UTC 2024 x86_64
User: www-data (33)
PHP: 8.4.10
Disabled: NONE
Upload Files
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,
        ]);
    }
}