query('search', '')); $transactions = $balances->adminTransactions($search !== '' ? $search : null) ->map(function ($transaction): array { $metadata = $transaction->metadata ?? []; return [ 'id' => $transaction->id, 'username' => $transaction->username ?: __('Аккаунт удалён'), 'account_id' => $transaction->account_id, 'created_at' => \App\Support\LocaleFormatting::date($transaction->created_at, true), 'type_label' => match ($transaction->type) { 'deposit' => __('Пополнение'), 'spend' => __('Покупка в игре'), 'admin_credit' => __('Начисление администратором'), 'admin_debit' => __('Списание администратором'), default => $transaction->type, }, 'description' => $metadata['reason'] ?? $metadata['description'] ?? $transaction->reference, 'admin' => isset($metadata['admin_username']) ? [ 'username' => $metadata['admin_username'], 'account_id' => $metadata['admin_account_id'], ] : null, 'amount' => (string) $transaction->amount, 'formatted_amount' => \App\Support\LocaleFormatting::number((float) $transaction->amount, 2), 'is_positive' => (float) $transaction->amount >= 0, 'formatted_balance_after' => \App\Support\LocaleFormatting::number((float) $transaction->balance_after, 2), ]; }) ->values() ->all(); return Inertia::render('Admin/Balances', [ ...$this->portalProps($request), 'transactions' => $transactions, 'search' => $search, 'adjustUrl' => route('admin.balances.adjust'), 'old' => [ 'account' => $request->old('account', ''), 'direction' => $request->old('direction', 'credit'), 'amount' => $request->old('amount', ''), 'reason' => $request->old('reason', ''), ], ]); } public function adjust( AdjustBalanceRequest $request, VMangosAccountService $accounts, BalanceService $balances, ): RedirectResponse { $accountInput = trim($request->string('account')->toString()); $account = ctype_digit($accountInput) ? $accounts->findUserById((int) $accountInput) : $accounts->findUserByUsername($accountInput); if (! $account) { return back()->withInput()->withErrors(['account' => __('Игровой аккаунт не найден.')]); } try { $transaction = $balances->adjustByAdmin( $account->id, $request->string('amount')->toString(), $request->string('direction')->toString(), $request->user()->id, $request->user()->username, $request->string('reason')->toString(), ); } catch (InvalidArgumentException $exception) { return back()->withInput()->withErrors(['amount' => $exception->getMessage()]); } return back()->with('status', sprintf( __('Счёт %s изменён. Теперь на нём %s Слёз Элуны.'), $account->username, \App\Support\LocaleFormatting::number((float) $transaction->balance_after, 2), )); } }