{
  "issueId": "4201",
  "environment": "dev",
  "source": "user-provided checklist (Redmine #4201)",
  "scenario": "virtual-login-transfer-block",
  "sourceText": "요청자: 송인준\n[1] QA 요청 배경\n* https://itsm.bix.bz/issues/4201\n[2] 사전 데이터\n* ADMIN 계정 (가상로그인 실행, 2차 인증 가능)\n* 비스킷링크 TA 계정 (법인계좌·지급계좌·지갑 관리자 이체, 펌뱅크 송금 권한 프리셋 보유)\n* 비스킷링크 CO 계정 (지급계좌·지갑 관리자 이체 권한 프리셋 보유)\n* 비스킷페이 VE 계정 (스토어 지갑 잔액 보유)\n[3] 사전 작업\n* ADMIN으로 회원 목록에서 TA / CO / VE(스토어) 가상로그인 실행\n* 대조군: 같은 TA / CO / VE 계정 직접 로그인 세션 준비\n[4] 권한별 테스트\n* TA(가상): 이체하기 \"이체하기\"·\"머천트 이체\" 비활성 / 이체하기(렌탈페이) \"이체하기\" 비활성(목록 상단, 요청 상세) / 계좌 조회 행 \"이체\" 아이콘 비활성 / 법인계좌 관리·지급계좌 관리 \"관리자 이체 (가상 로그인 불가)\" 비활성 / 지갑 관리 \"지갑 복수이체 (가상 로그인 불가)\" 비활성 / 정산내역 \"지급+전산완료\" 비활성\n* CO(가상): 이체하기 \"머천트 이체\" 비활성 / 지급계좌 관리 \"관리자 이체\" 비활성 / 계약법인 이체내역 \"관리자 이체\" 비활성 / 지갑 관리 \"지갑 복수이체\" 비활성 / 정산내역·채권관리 \"지급+전산완료\" 비활성\n* VE(가상, 스토어): 지갑 송금·생체인증 이체 시도 시 \"가상 로그인 상태에서는 외부 이체를 할 수 없습니다.\" 에러, 송금 안 됨\n* 대조군(직접 로그인 TA/CO/VE): 위 버튼·메뉴 활성, 이체 정상 진행\n[5] 검증 대상\n* 가상로그인 외부 이체 차단(버튼·메뉴 비활성, 외부 이체 API 403)\n* 가상로그인 내부 이동·조회 정상\n* 직접 로그인 이체 기능 회귀 없음\n[6] 체크리스트\n* 가상로그인 시 [4] 버튼·메뉴 비활성 + 툴팁 사유\n* 가상로그인 중 내부 이동 정상: 지급계좌 관리 \"지급계좌간 이체\", 지갑 → 지급계좌·법인계좌 이체\n* 가상로그인 중 이체내역 조회, 엑셀 다운로드, 이체 영수증 조회 정상\n* 스토어(VE) 가상로그인 지갑 송금 403 메시지, 잔액 변동 없음\n* (선택) 외부 이체 API 직접 호출 시 403 + 메시지\n* 직접 로그인 TA/CO/VE는 같은 화면에서 이체 정상 진행(회귀)\n* 가상로그인 종료 후 ADMIN 세션 이체 버튼 재활성",
  "scope": "개발계 가상로그인 상태 외부 이체 차단 및 내부 이동·직접 로그인 회귀 QA",
  "checklist": [
    "TA/CO 가상로그인 시 외부 이체 버튼·메뉴 비활성 + 툴팁 사유(\"가상 로그인 상태에서는 외부 이체를 할 수 없습니다.\")",
    "가상로그인 중 내부 이동 메뉴(지급계좌간/법인계좌간/지갑 이체 등)는 활성 유지",
    "가상로그인 중 이체내역 조회·엑셀 버튼 정상",
    "외부 이체 API를 빈 본문으로 호출해 가상로그인 403 + 메시지 확인(존재하지 않는 ID라 실제 이체 없음)",
    "VE 스토어 가상로그인 지갑 송금 API 403, 지갑 잔액 변동 없음",
    "직접 로그인 TA/CO/VE는 같은 버튼·메뉴 활성, 차단 메시지 없음(회귀)",
    "가상로그인 종료 후 ADMIN 세션 이체 버튼 재활성",
    "요청에 따라 실제 이체는 실행하지 않고 버튼 상태와 API 차단까지만 확인",
    "CO 범위: 이체하기(머천트 이체), 지급계좌 관리, 지갑 관리, 정산내역 (계약법인 이체내역·채권관리는 CO 대상 아님, 요청자 확정)"
  ],
  "roles": [
    "ADMIN",
    "TA",
    "CO"
  ],
  "routeCandidates": "../../../../qa-results/issues/4201/dev/route-candidates.json",
  "setupSteps": [
    {
      "name": "가상로그인 실행",
      "kind": "state-verify",
      "role": "ADMIN",
      "application": "admin",
      "mutation": "none",
      "description": "ADMIN 계정 관리에서 TA/CO(전산), VE(스토어) 계정으로 가상로그인을 시작한다. ADMIN PIN 인증 필요."
    }
  ],
  "pages": [
    {
      "name": "이체하기",
      "application": "admin",
      "path": "/account/remittance-manage",
      "tenantParam": "tenantId",
      "roles": [
        "TA"
      ],
      "kind": "buttons",
      "labels": [
        "이체하기",
        "머천트 이체"
      ]
    },
    {
      "name": "이체하기(CO)",
      "application": "admin",
      "path": "/account/remittance-manage",
      "tenantParam": "tenantId",
      "roles": [
        "CO"
      ],
      "kind": "buttons",
      "labels": [
        "머천트 이체"
      ]
    },
    {
      "name": "이체하기(렌탈페이)",
      "application": "admin",
      "path": "/account/remittance-manage-rentalpay",
      "tenantParam": "tenantId",
      "roles": [
        "TA"
      ],
      "kind": "rental-detail"
    },
    {
      "name": "계좌 조회(펌뱅킹 등록)",
      "application": "admin",
      "path": "/account/account-inquiry",
      "tenantParam": "tenantId",
      "roles": [
        "TA"
      ],
      "kind": "row-icon"
    },
    {
      "name": "법인계좌 관리",
      "application": "admin",
      "path": "/master-accounting/corporation-accounts",
      "tenantParam": "tenantId",
      "roles": [
        "TA"
      ],
      "kind": "dropdown",
      "blockedItem": "관리자 이체",
      "internalItems": [
        "법인계좌간 이체",
        "지갑 이체",
        "지급계좌 이체"
      ]
    },
    {
      "name": "지급계좌 관리",
      "application": "admin",
      "path": "/master-accounting/disbursement-accounts",
      "tenantParam": "tenantId",
      "roles": [
        "TA",
        "CO"
      ],
      "kind": "dropdown",
      "blockedItem": "관리자 이체",
      "internalItems": [
        "지급계좌간 이체",
        "지갑 이체",
        "법인계좌 이체"
      ]
    },
    {
      "name": "지갑 관리",
      "application": "admin",
      "path": "/master-accounting/wallet-management",
      "tenantParam": "tenantId",
      "roles": [
        "TA",
        "CO"
      ],
      "kind": "dropdown",
      "blockedItem": "지갑 복수이체",
      "internalItems": [
        "수동정산금 이체"
      ]
    },
    {
      "name": "정산내역",
      "application": "admin",
      "path": "/settlement-history/settlement-details",
      "tenantParam": "tenantId",
      "roles": [
        "TA",
        "CO"
      ],
      "kind": "select-row",
      "labels": [
        "지급+전산완료"
      ],
      "searchFrom": "2026-09-01",
      "searchTo": "2026-09-30"
    }
  ]
}
