*/ private const VALID_STEPS = [ 'welcome', 'account-types', 'create-account', 'import-transactions', 'import-balances', 'category-types', 'customize-categories', 'smart-rules', 'syncing', 'ai-suggestions', 'categorize-transactions', 'complete', ]; public function index(Request $request): Response { $user = $request->user(); $banks = Bank::query() ->availableForUser($user) ->orderBy('name') ->get(); $accounts = $user->accounts() ->with('bank') ->get(); $categories = Category::query() ->where('user_id', $user->id) ->forDisplay() ->get(); $transactions = Transaction::query() ->where('user_id', $user->id) ->whereNull('category_id') ->with(['account.bank', 'labels']) ->orderBy('transaction_date', 'desc') ->orderBy('id', 'desc') ->get(); $step = $request->query('step'); $initialStep = is_string($step) && in_array($step, self::VALID_STEPS, true) ? $step : null; return Inertia::render('onboarding/index', [ 'banks' => $banks, 'accounts' => $accounts, 'categories' => $categories, 'transactions' => $transactions, 'initialStep' => $initialStep, ]); } public function syncStatus(Request $request): JsonResponse { $pending = $request->user() ->bankingConnections() ->where('status', BankingConnectionStatus::Active) ->whereNull('last_synced_at') ->exists(); return response()->json(['pending' => $pending]); } public function complete(Request $request): RedirectResponse { $request->user()->update([ 'onboarded_at' => now(), ]); return redirect()->route('dashboard'); } }