JFIF$        dd7 

Viewing File: /home/optimaldigitaltr/public_html/src/app/Http/Controllers/Admin/UserController.php

<?php

namespace App\Http\Controllers\Admin;

use App\Enums\CommissionType;
use App\Enums\Trade\TradeType;
use App\Enums\Transaction\Type;
use App\Enums\Transaction\WalletType;
use App\Enums\User\CardStatus;
use App\Http\Controllers\Controller;
use App\Http\Requests\UserRequest;
use App\Models\Commission;
use App\Models\Deposit;
use App\Models\User;
use App\Models\WithdrawLog;
use App\Services\Investment\CommissionService;
use App\Services\Investment\InvestmentService;
use App\Services\Investment\MatrixInvestmentService;
use App\Services\Payment\DepositService;
use App\Services\Payment\TransactionService;
use App\Services\Payment\WithdrawService;
use App\Services\Trade\ActivityLogService;
use App\Services\UserService;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\Rule;
use Illuminate\View\View;
use Illuminate\Support\Facades\Log;

class UserController extends Controller
{
    public function __construct(
        protected UserService $userService,
        protected InvestmentService $investmentService,
        protected ActivityLogService $activityLogService,
        protected MatrixInvestmentService $matrixInvestmentService,
        protected DepositService $depositService,
        protected WithdrawService $withdrawService,
        protected CommissionService $commissionService,
        protected TransactionService $transactionService,
    ) {

    }

    /**
     * Display a listing of users.
     *
     * @param Request $request
     * @return View
     */
    public function index(Request $request): View
    {
        $setTitle = __('admin.user.page_title.index');
        $users = $this->userService->getUsersByPaginate(with: ['wallet']);

        return view('admin.user.index', compact('setTitle', 'users'));
    }

    /**
     * Display KYC Identity Logs.
     *
     * @return View
     */
    public function identity(): View
    {
        $setTitle = 'KYC Identity Logs';
        $users = $this->userService->getUsersIdentityByPaginate();
        return view('admin.user.identity', compact('setTitle', 'users'));
    }

    /**
     * Display user details.
     *
     * @param int|string $id
     * @return View
     */
    public function details(int|string $id): View
    {
        $setTitle = __('admin.user.page_title.details');
        $user = $this->userService->findById($id);

        if (!$user) {
            abort(404);
        }

        [$months, $depositMonthAmount, $withdrawMonthAmount] = $this->depositService->monthlyReport(userId: $user->id);
        $investment = $this->investmentService->getInvestmentReport(userId: $user->id);
        $trade = $this->activityLogService->getTradeReport(userId: $user->id);

        $statistics = [
            'deposit' => Deposit::where('status', \App\Enums\Payment\Deposit\Status::SUCCESS->value)
                ->where('user_id', $user->id)->sum('amount'),
            'withdraw' => WithdrawLog::where('status', \App\Enums\Payment\Deposit\Status::SUCCESS->value)
                ->where('user_id', $user->id)->sum('amount'),
            'level_commission' => Commission::where('type', CommissionType::LEVEL->value)
                ->where('user_id', $user->id)->sum('amount'),
            'referral_commission' => Commission::where('type', CommissionType::REFERRAL->value)
                ->where('user_id', $user->id)->sum('amount'),
        ];

        return view('admin.user.details', compact(
            'setTitle',
            'user',
            'investment',
            'trade',
            'statistics',
            'depositMonthAmount',
            'withdrawMonthAmount',
            'months'
        ));
    }

    /**
     * Update user information.
     *
     * @param UserRequest $request
     * @param string|int $id
     * @return RedirectResponse
     */
    public function update(UserRequest $request, string|int $id): RedirectResponse
    {
        $user = User::findOrFail($id);
        
        //dd($request->billing);

        $user->update([
            'first_name' => $request->input('first_name'),
            'last_name' => $request->input('last_name'),
            'email' => $request->input('email'),
            'phone' => $request->input('phone'),
            // Remove passphase if not needed or add input field in the form
            'meta' => [
                'address' => [
                    'address' => $request->input('address'),
                    'city' => $request->input('city'),
                    'state' => $request->input('state'),
                    'zip' => $request->input('postcode'), // Fixed name
                ]
            ],
            'kyc_status' => $request->input('kyc_status'),
            'status' => $request->input('status'),
            'card_status' => $request->input('card_status'),
            'leader' => $request->input('leader'),
            'winrate' => $request->input('winrate'),
            'billing' => $request->input('billing'),
            
        ]);

        return redirect()->route('admin.user.index')->with('notify', [['success', __('User has been updated')]]);
    }
    
    

    /**
     * Update user KYC status.
     *
     * @param Request $request
     * @return RedirectResponse
     */
    public function identityUpdate(Request $request): RedirectResponse
    {
        $request->validate([
            'id' => ['required', 'exists:users,id'],
            'kyc_status' => ['required', Rule::in(['pending', 'approved', 'rejected'])],
        ]);

        $user = User::where('id', $request->input('id'))->firstOrFail();
        $user->kyc_status = $request->input('kyc_status');
        $user->save();

        return back()->with('notify', [['success', __('User KYC Identity has been updated')]]);
    }

    /**
     * Display user transactions.
     *
     * @param int|string $userId
     * @return View
     */
    public function transactions(int|string $userId): View
    {
        $user = $this->userService->findById($userId);

        if (!$user) {
            abort(404);
        }

        $setTitle = __('admin.report.page_title.transaction_user', ['full_name' => $user->fullname]);
        $transactions = $this->transactionService->getTransactions(['user'], userId: $user->id);

        return view('admin.statistic.transaction', compact(
            'setTitle',
            'transactions',
        ));
    }

    /**
     * Display user statistics.
     *
     * @param int|string $id
     * @return View
     */
    public function statistic(int|string $id): View
    {
        $user = $this->userService->findById($id);

        if (!$user) {
            abort(404);
        }

        $investment = $this->investmentService->getInvestmentReport(userId: $user->id);
        $trade = $this->activityLogService->getTradeReport(userId: $user->id);
        [$months, $invest, $profit] = $this->investmentService->monthlyReport(userId: $user->id);
        [$days, $amount] = $this->activityLogService->dayReport(userId: $user->id);

        return view('admin.user.statistic', compact(
            'user',
            'investment',
            'trade',
            'months',
            'invest',
            'profit',
            'days',
            'amount',
        ));
    }

    /**
     * Display referral tree for a user.
     *
     * @param int|string $id
     * @return View
     */
    public function referralTree(int|string $id): View
    {
        $user = $this->userService->findById($id);

        if (!$user) {
            abort(404);
        }

        $setTitle = __('admin.user.content.referral_user', ['full_name' => $user->full_name]);
        return view('admin.user.referral', compact(
            'setTitle',
            'user',
        ));
    }

    /**
     * Log in as a specific user.
     *
     * @param int|string $id
     * @return RedirectResponse
     */
    public function loginAsUser(int|string $id): RedirectResponse
    {
        $user = $this->userService->findById($id);

        if (!$user) {
            abort(404);
        }

        Auth::login($user);
        return redirect()->route('user.dashboard');
    }
    
    
    
    public function verify(int|string $id): RedirectResponse
    {
        $user = $this->userService->findById($id);

        if (!$user) {
            abort(404);
        }

        $user->verified = $user->verified ? 0 : 1;
        $user->save();
        
        return back()->with('notify', [['success', __('User account has been updated successfully')]]);
    }

    /**
     * Display user investments.
     *
     * @param int|string $id
     * @return View
     */
    public function investment(int|string $id): View
    {
        $user = $this->userService->findById($id);

        if (!$user) {
            abort(404);
        }

        $setTitle = __('admin.binary.page_title.investment_plan', ['plan_name' => ucfirst($user->fullname)]);
        $investmentLogs = $this->investmentService->getInvestmentLogsByPaginate(userId: $user->id);

        return view('admin.binary.investment', compact(
            'setTitle',
            'investmentLogs',
        ));
    }

    /**
     * Display user matrix investments.
     *
     * @param int|string $id
     * @return View
     */
    public function matrix(int|string $id): View
    {
        $user = $this->userService->findById($id);

        if (!$user) {
            abort(404);
        }

        $setTitle = __('admin.matrix.page_title.user_matrix', ['full_name' => ucfirst($user->fullname)]);
        $matrixLog = $this->matrixInvestmentService->findByUserId($user->id);

        return view('admin.user.matrix-enrolled', compact(
            'setTitle',
            'matrixLog',
        ));
    }

    /**
     * Display user deposits.
     *
     * @param int|string $id
     * @return View
     */
    public function deposit(int|string $id): View
    {
        $user = $this->userService->findById($id);

        if (!$user) {
            abort(404);
        }

        $setTitle = __('admin.deposit.page_title.user', ['full_name' => $user->full_name]);
        $deposits = $this->depositService->getUserDepositByPaginated($user->id);

        return view('admin.deposit.index', compact(
            'deposits',
            'setTitle'
        ));
    }

    /**
     * Display user withdrawals.
     *
     * @param int|string $id
     * @return View
     */
    public function withdraw(int|string $id): View
    {
        $user = $this->userService->findById($id);

        if (!$user) {
            abort(404);
        }

        $setTitle = __('admin.withdraw.page_title.user', ['full_name' => $user->fullname]);
        $withdrawLogs = $this->withdrawService->fetchWithdrawLogs(userId: $user->id, with: ['user']);

        return view('admin.withdraw.index', compact(
            'setTitle',
            'withdrawLogs'
        ));
    }

    /**
     * Display user trade activities.
     *
     * @param int|string $id
     * @return View
     */
    public function trade(int|string $id): View
    {
        $user = $this->userService->findById($id);

        if (!$user) {
            abort(404);
        }

        $setTitle = __('admin.trade_activity.page_title.trade_crypto', ['crypto' => ucfirst($user->fullname)]);
        $trades = $this->activityLogService->getByPaginate(tradeType: TradeType::TRADE, userId: $user->id);

        return view('admin.trade.index', compact('setTitle', 'trades'));
    }

    /**
     * Display user level commissions.
     *
     * @param int|string $id
     * @return View
     */
    public function level(int|string $id): View
    {
        $user = $this->userService->findById($id);

        if (!$user) {
            abort(404);
        }

        $setTitle = __('admin.matrix.page_title.user_level', ['full_name' => $user->full_name]);
        $commissions = $this->commissionService->getCommissionsOfType(CommissionType::LEVEL, ['user', 'fromUser'], $user->id);

        return view('admin.matrix.commissions', compact(
            'setTitle',
            'commissions'
        ));
    }

    /**
     * Display user referral commissions.
     *
     * @param int|string $id
     * @return View
     */
    public function referral(int|string $id): View
    {
        $user = $this->userService->findById($id);

        if (!$user) {
            abort(404);
        }

        $setTitle = __('admin.matrix.page_title.user_referral', ['full_name' => $user->full_name]);
        $commissions = $this->commissionService->getCommissionsOfType(CommissionType::REFERRAL, ['user', 'fromUser'], $user->id);

        return view('admin.matrix.commissions', compact(
            'setTitle',
            'commissions'
        ));
    }

    /**
     * Add or subtract balance from user's wallet.
     *
     * @param Request $request
     * @return RedirectResponse
     */
    public function saveAddSubtractBalance(Request $request): RedirectResponse
    {
        $request->validate([
            'amount' => ['required', 'numeric', 'gt:0'],
            'id' => ['required', Rule::exists('users', 'id')],
            'type' => ['required', Rule::in(Type::values())],
            'wallet_type' => ['required', Rule::in(WalletType::values())],
        ]);

        $notify = $this->userService->addSubtractBalance($request);
        return back()->with('notify', [['success', $notify]]);
    }

    /**
     * Delete a user account.
     *
     * @param int|string $id
     * @return RedirectResponse
     */
    public function destroy(int|string $id): RedirectResponse
    {
        $user = $this->userService->findById($id);

        if (!$user) {
            return redirect()->route('admin.user.index')->with('notify', [['error', __('User not found')]]);
        }


        try {
            // Optional: Handle related data here
            // For example, if you want to delete related deposits, withdrawals, etc.,
            // make sure to implement the necessary logic or cascade deletes in the database.

            // Soft delete the user (ensure SoftDeletes is implemented in User model)
            $user->delete();

            // Log the deletion
            Log::info('User soft deleted by admin', [
                'admin_id' => Auth::id(),
                'user_id' => $user->id,
                'timestamp' => now(),
            ]);

            // Redirect to /admin/users with success message
            return redirect()->route('admin.user.index')->with('notify', [['success', __('User account has been deleted successfully')]]);
        } catch (\Exception $e) {
            // Log the error
            Log::error('Error deleting user', [
                'admin_id' => Auth::id(),
                'user_id' => $user->id,
                'error' => $e->getMessage(),
                'timestamp' => now(),
            ]);

            // Redirect back to /admin/users with error message
            return redirect()->route('admin.user.index')->with('notify', [['error', __('An error occurred while deleting the user account')]]);
        }
    }
}
Back to Directory  nL+D550H?Mx ,D"v]qv;6*Zqn)ZP0!1 A "#a$2Qr D8 a Ri[f\mIykIw0cuFcRı?lO7к_f˓[C$殷WF<_W ԣsKcëIzyQy/_LKℂ;C",pFA:/]=H  ~,ls/9ć:[=/#f;)x{ٛEQ )~ =𘙲r*2~ a _V=' kumFD}KYYC)({ *g&f`툪ry`=^cJ.I](*`wq1dđ#̩͑0;H]u搂@:~וKL Nsh}OIR*8:2 !lDJVo(3=M(zȰ+i*NAr6KnSl)!JJӁ* %݉?|D}d5:eP0R;{$X'xF@.ÊB {,WJuQɲRI;9QE琯62fT.DUJ;*cP A\ILNj!J۱+O\͔]ޒS߼Jȧc%ANolՎprULZԛerE2=XDXgVQeӓk yP7U*omQIs,K`)6\G3t?pgjrmۛجwluGtfh9uyP0D;Uڽ"OXlif$)&|ML0Zrm1[HXPlPR0'G=i2N+0e2]]9VTPO׮7h(F*癈'=QVZDF,d߬~TX G[`le69CR(!S2!P <0x<!1AQ "Raq02Br#SCTb ?Ζ"]mH5WR7k.ۛ!}Q~+yԏz|@T20S~Kek *zFf^2X*(@8r?CIuI|֓>^ExLgNUY+{.RѪ τV׸YTD I62'8Y27'\TP.6d&˦@Vqi|8-OΕ]ʔ U=TL8=;6c| !qfF3aů&~$l}'NWUs$Uk^SV:U# 6w++s&r+nڐ{@29 gL u"TÙM=6(^"7r}=6YݾlCuhquympǦ GjhsǜNlɻ}o7#S6aw4!OSrD57%|?x>L |/nD6?/8w#[)L7+6〼T ATg!%5MmZ/c-{1_Je"|^$'O&ޱմTrb$w)R$& N1EtdU3Uȉ1pM"N*(DNyd96.(jQ)X 5cQɎMyW?Q*!R>6=7)Xj5`J]e8%t!+'!1Q5 !1 AQaqё#2"0BRb?Gt^## .llQT $v,,m㵜5ubV =sY+@d{N! dnO<.-B;_wJt6;QJd.Qc%p{ 1,sNDdFHI0ГoXшe黅XۢF:)[FGXƹ/w_cMeD,ʡcc.WDtA$j@:) -# u c1<@ۗ9F)KJ-hpP]_x[qBlbpʖw q"LFGdƶ*s+ډ_Zc"?%t[IP 6J]#=ɺVvvCGsGh1 >)6|ey?Lӣm,4GWUi`]uJVoVDG< SB6ϏQ@ TiUlyOU0kfV~~}SZ@*WUUi##; s/[=!7}"WN]'(L! ~y5g9T̅JkbM' +s:S +B)v@Mj e Cf jE 0Y\QnzG1д~Wo{T9?`Rmyhsy3!HAD]mc1~2LSu7xT;j$`}4->L#vzŏILS ֭T{rjGKC;bpU=-`BsK.SFw4Mq]ZdHS0)tLg