File "BalanceTransferController.php"

Full Path: /home/trinadezambia/public_html/gambling/app/Http/Controllers/User/BalanceTransferController.php
File size: 4.75 KB
MIME-type: text/x-php
Charset: utf-8

<?php

namespace App\Http\Controllers\User;

use App\Constants\Status;
use App\Http\Controllers\Controller;
use App\Models\BalanceTransfer;
use App\Models\Transaction;
use App\Models\User;
use Illuminate\Http\Request;

class BalanceTransferController extends Controller {
    public function index() {
        $pageTitle        = "Balance Transfer";
        $user             = auth()->user();
        $balanceTransfers = BalanceTransfer::where('sender_id', $user->id)->with('receiveUser')->searchable(['trx', "receiveUser:username"])->latest()->paginate(getPaginate());
        return view('Template::user.transfer.index', compact('pageTitle', 'balanceTransfers', 'user'));
    }

    public function store(Request $request) {
        $request->validate([
            'username' => 'required',
            'amount'   => 'required|numeric|gt:0',
        ]);

        if (!gs('balance_transfer')) {
            $notify[] = ['error', 'Balance transfer is not available!'];
            return back()->withNotify($notify);
        }

        $sender   = auth()->user();
        $receiver = User::where('username', $request->username)->where('status', Status::USER_ACTIVE)->first();

        if (!$receiver) {
            $notify[] = ['error', 'Receiver not found!'];
            return back()->withNotify($notify)->withInput();
        }

        if ($sender->id == $receiver->id) {
            $notify[] = ['error', 'You can\'t transfer balance to your own account!'];
            return back()->withNotify($notify)->withInput();
        }

        $fixedCharge   = gs('balance_transfer_fixed_charge');
        $percentCharge = gs('balance_transfer_percent_charge');
        $charge        = $fixedCharge + ($percentCharge * $request->amount) / 100;

        $finalAmount = $request->amount + $charge;

        if ($sender->balance < $finalAmount) {
            $notify[] = ['error', 'Insufficient balance to complete the transaction'];
            return back()->withNotify($notify)->withInput();
        }

        $balanceTransfer               = new BalanceTransfer();
        $balanceTransfer->sender_id    = $sender->id;
        $balanceTransfer->receiver_id  = $receiver->id;
        $balanceTransfer->amount       = $request->amount;
        $balanceTransfer->charge       = $charge;
        $balanceTransfer->final_amount = $finalAmount;
        $balanceTransfer->trx          = getTrx();
        $balanceTransfer->save();

        $sender->balance -= $finalAmount;
        $sender->save();

        $transaction               = new Transaction();
        $transaction->user_id      = $sender->id;
        $transaction->amount       = $finalAmount;
        $transaction->charge       = $charge;
        $transaction->post_balance = $sender->balance;
        $transaction->trx_type     = '-';
        $transaction->trx          = $balanceTransfer->trx;
        $transaction->details      = "Balance Transfer " . showAmount($request->amount) . " to $receiver->username.";
        $transaction->remark       = "balance_transfer";
        $transaction->save();

        $receiver->balance += $request->amount;
        $receiver->save();

        $transaction               = new Transaction();
        $transaction->user_id      = $receiver->id;
        $transaction->amount       = $request->amount;
        $transaction->charge       = 0;
        $transaction->post_balance = $receiver->balance;
        $transaction->trx_type     = '+';
        $transaction->trx          = $balanceTransfer->trx;
        $transaction->details      = "Balance Transfer received " . showAmount($request->amount) . " from $sender->username.";
        $transaction->remark       = "balance_received";
        $transaction->save();

        notify($receiver, 'BALANCE_TRANSFER', [
            'sender'       => $sender->username,
            'sent_at'      => showDateTime($balanceTransfer->created_at),
            'amount'       => showAmount($request->amount, currencyFormat: false),
            'trx'          => $balanceTransfer->trx,
            'post_balance' => showAmount($receiver->balance, currencyFormat: false),
        ]);

        $notify[] = ['success', 'Balance transfer successful!'];
        return redirect()->route('user.transfer.index')->withNotify($notify);
    }

    public function validateUsername(Request $request) {
        $request->validate([
            'username' => 'required',
        ]);

        $user = auth()->user();

        $receivedUser = User::where('username', $request->username)->first();

        if (!$receivedUser) {
            return response()->json(['exists' => false, 'error' => 'Receiver not found']);
        }
        if ($user->id == $receivedUser->id) {
            return response()->json(['exists' => false, 'error' => 'Cannot transfer to yourself']);
        }
        return response()->json(['exists' => true]);
    }
}