find($productId); $sku = DB::table('gc_product_skus')->find($skuId); if (!$product || !$sku) { return redirect()->back()->with('toast', ['type' => 'danger', 'message' => '잘못된 접근입니다.']); } // ✅ 수정된 Service 반환값(배열) 받기 $pinData = $this->service->getPinsBySku($skuId, $request->all()); $pins = $pinData['pins']; $stats = $pinData['stats']; // 통계 데이터 $pins->getCollection()->transform(function ($pin) { try { $decrypted = Crypt::decryptString($pin->pin_code); $length = strlen($decrypted); $pin->decrypted_code = substr($decrypted, 0, 4) . str_repeat('*', max(0, $length - 8)) . substr($decrypted, -4); } catch (\Exception $e) { $pin->decrypted_code = '복호화 에러'; } return $pin; }); // 뷰로 변수 묶어서 전달 return view('admin.product.pins.index', compact('product', 'sku', 'pins', 'stats')); } // 핀 회수 및 다운로드 요청 처리 public function recallBulk(Request $request, int $productId, int $skuId) { $request->validate([ 'amount_type' => ['required', 'string'], 'custom_amount' => ['nullable', 'integer', 'min:1'], 'zip_password' => ['required', 'string', 'min:4'], ]); $amount = (int)$request->input('custom_amount', 0); if ($request->input('amount_type') !== 'ALL' && $amount <= 0) { $amount = (int)$request->input('amount_type'); } $res = $this->service->recallPins($skuId, $request->input('amount_type'), $amount, $request->input('zip_password')); if (!$res['ok']) { return redirect()->back()->with('toast', ['type' => 'danger', 'title' => '오류', 'message' => $res['message']]); } // 성공 시 응답으로 파일을 다운로드하고, 전송이 끝나면 서버에서 임시 zip 파일을 즉시 삭제(deleteFileAfterSend) return response()->download($res['file_path'], $res['file_name'])->deleteFileAfterSend(true); } // 대량 등록 처리 public function storeBulk(Request $request, int $productId, int $skuId) { $request->validate([ 'bulk_text' => ['required', 'string'], 'expiry_date' => ['nullable', 'date'], ]); $res = $this->service->bulkRegisterPins( $productId, $skuId, $request->input('bulk_text'), $request->input('expiry_date') ); if (!$res['ok']) { return redirect()->back()->withInput()->with('toast', ['type' => 'danger', 'title' => '등록 실패', 'message' => $res['message']]); } return redirect()->route('admin.pins.index', ['productId' => $productId, 'skuId' => $skuId]) ->with('toast', ['type' => 'success', 'title' => '완료', 'message' => $res['message']]); } }