Files
moonwell-web/app/Http/Controllers/Admin/BalanceController.php
T
2026-07-25 18:36:45 +04:00

102 lines
4.2 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Concerns\BuildsPortalProps;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\AdjustBalanceRequest;
use App\Services\AzerothCoreAccountService;
use App\Services\BalanceService;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Inertia\Inertia;
use Inertia\Response;
use InvalidArgumentException;
class BalanceController extends Controller
{
use BuildsPortalProps;
public function index(Request $request, BalanceService $balances): Response
{
$search = trim((string) $request->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' => $transaction->created_at?->format('d.m.Y H:i:s'),
'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' => number_format((float) $transaction->amount, 2, ',', ' '),
'is_positive' => (float) $transaction->amount >= 0,
'formatted_balance_after' => number_format((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,
AzerothCoreAccountService $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,
number_format((float) $transaction->balance_after, 2, ',', ' '),
));
}
}