route('web.auth.login'); } $memNo = (int)session('_sess._mno', 0); if ($memNo <= 0) abort(403); $out = $this->ownPinIssueService->issuePinInstant($attemptId, $memNo); if (!($out['ok'] ?? false)) { return redirect()->back()->with('error', (string)($out['message'] ?? '발행 실패')); } return redirect()->route('web.mypage.usage.show', ['attemptId' => $attemptId]) ->with('success', (string)($out['message'] ?? '발행 완료')); } public function revealPins(Request $request, int $attemptId) { if ((bool)session('_sess._login_') !== true) { return redirect()->route('web.auth.login'); } $memNo = (int)session('_sess._mno', 0); if ($memNo <= 0) abort(403); $data = $request->validate([ 'pin2' => ['required', 'string', 'min:4', 'max:20'], ]); $out = $this->service->revealPins( $attemptId, $memNo, (string)$data['pin2'] ); if (!($out['ok'] ?? false)) { return redirect() ->route('web.mypage.usage.show', ['attemptId' => $attemptId]) ->with('error', (string)($out['message'] ?? '핀번호 확인에 실패했습니다.')); } return redirect() ->route('web.mypage.usage.show', ['attemptId' => $attemptId, 'revealed' => 1]) ->with('success', '핀번호 확인이 완료되었습니다.'); } /** * GET /mypage/usage * - 리스트 + 검색 + 페이징 * - 호환: /mypage/usage?attempt_id=123 -> show로 redirect */ public function index(Request $request) { if ((bool)session('_sess._login_') !== true) { return redirect()->route('web.auth.login'); } $memNo = (int)session('_sess._mno', 0); if ($memNo <= 0) abort(403); $attemptId = $request->query('attempt_id'); $attemptId = is_numeric($attemptId) ? (int)$attemptId : null; if ($attemptId !== null && $attemptId >= 1) { return redirect()->route('web.mypage.usage.show', ['attemptId' => $attemptId]); } $filters = [ 'q' => trim((string)$request->query('q', '')), 'method' => trim((string)$request->query('method', '')), 'status' => trim((string)$request->query('status', '')), 'from' => trim((string)$request->query('from', '')), 'to' => trim((string)$request->query('to', '')), ]; $data = $this->service->buildListPageData($memNo, $filters); return view('web.mypage.usage.index', $data); } /** * GET /mypage/usage/{attemptId} */ public function show(Request $request, int $attemptId) { if ((bool)session('_sess._login_') !== true) { return redirect()->route('web.auth.login'); } $memNo = (int)session('_sess._mno', 0); if ($memNo <= 0) abort(403); $data = $this->service->buildDetailPageData($attemptId, $memNo); return view('web.mypage.usage.show', $data); } /** * POST /mypage/usage/{attemptId}/open * - 핀 "오픈(확인)" 처리: ret_data에 pin_opened_at 기록 */ public function openPins(Request $request, int $attemptId) { if ((bool)session('_sess._login_') !== true) { return redirect()->route('web.auth.login'); } $memNo = (int)session('_sess._mno', 0); if ($memNo <= 0) abort(403); $out = $this->service->openPins($attemptId, $memNo); if (!($out['ok'] ?? false)) { return redirect()->back()->with('error', (string)($out['message'] ?? '처리 실패')); } return redirect()->route('web.mypage.usage.show', ['attemptId' => $attemptId]) ->with('success', '핀 확인이 완료되었습니다.'); } /** * POST /mypage/usage/{attemptId}/cancel * - 결제완료 후 취소(핀 오픈 전만) */ public function cancel(Request $request, int $attemptId) { if ((bool)session('_sess._login_') !== true) { return redirect()->route('web.auth.login'); } $memNo = (int)session('_sess._mno', 0); if ($memNo <= 0) abort(403); $data = $request->validate([ 'reason' => ['nullable','string','max:255'], ]); $out = $this->service->cancelPaidAttempt($attemptId, $memNo, (string)($data['reason'] ?? '사용자 요청')); if (!($out['ok'] ?? false)) { return redirect()->back()->with('error', (string)($out['message'] ?? '취소 실패')); } return redirect()->route('web.mypage.usage.show', array_filter([ 'attemptId' => $attemptId, 'q' => $request->input('q'), 'method' => $request->input('method'), 'status' => $request->input('status'), 'from' => $request->input('from'), 'to' => $request->input('to'), 'page' => $request->input('page'), ], fn ($v) => $v !== null && $v !== '')) ->with('success', '결제가 취소되었습니다.'); } }