{
  "issueId": "3518",
  "environment": "dev",
  "source": "Redmine #3518 QA checklist - recovery bond transfer limit",
  "scenario": "recovery-bond-transfer-limit",
  "sourceText": "주홍석님의 QA 요청입니다\n조지민 프로님 안녕하세요, 비스킷 링크 개발계 QA 요청드립니다\n[1] QA 요청 배경\n- https://itsm.bix.bz/issues/3518\n- 정산 지급 및 법인계좌 출금성 이체 시 금일 발생 회수채권은 금액 제한에서 제외되도록 조정했습니다.\n[2] 사전 데이터\n- 법인계좌명: A_주홍석_일반법인\n- 검증 계정: hsjve40 / <redacted> / <redacted>\n- 수기결제를 진행하면 해당 법인계좌에 회수채권이 생성됩니다.\n- 전일 또는 주말 이전 회수채권이 남아있는 법인계좌가 있으면 함께 비교 검증\n[3] 사전 작업\n- admin 및 가맹점 권한 계정으로 대상 메뉴 접근 가능 여부 확인\n- 수기결제 후 법인계좌, 정산 내역, 채권 내역을 확인할 수 있는 메뉴 권한 확인\n[4] 권한별 테스트\n- admin\n- ve\n[5] 검증 대상\n- 어드민 수기결제 화면\n- 어드민 법인계좌 이체 화면\n- 법인계좌 잔액 및 이체내역 화면\n- 정산 내역 및 정산 처리 결과 화면\n- 채권 내역 화면\n[6] 체크리스트\n- 어드민 수기결제 화면에서 A_주홍석_일반법인 계정으로 수기결제를 진행한 뒤 해당 법인계좌에 회수채권이 표시되는지 확인\n- 법인계좌 간 이체 화면에서 금일 발생 회수채권이 있는 법인계좌는 잔액 범위 내 이체 시 금액 부족 안내 없이 이체가 완료되는지 확인\n- 법인계좌에서 지갑으로 이체할 때 금일 발생 회수채권이 금액 제한에 포함되지 않고 정상 이체되는지 확인\n- 법인계좌에서 지급계좌로 이체할 때 금일 발생 회수채권이 금액 제한에 포함되지 않고 정상 이체되는지 확인\n- 전일 또는 주말 이전 회수채권이 남아있는 법인계좌는 이체 가능 금액을 초과하면 금액 부족 안내가 보이고 이체가 생성되지 않는지 확인\n- 정산 처리 결과 화면에서 금일 발생 회수채권 때문에 정산 지급이 실패하지 않고 정상 처리되는지 확인\n- 정산 또는 이체 완료 후 법인계좌 잔액, 이체내역, 정산내역, 채권내역 화면의 금액이 서로 어긋나지 않는지 확인",
  "scope": "dev 환경에서 hsjve40 가맹점 계정으로 수기결제를 생성해 금일 회수채권을 만들고, ADMIN 계정으로 A_주홍석_일반법인의 법인계좌/채권/정산/이체 화면과 API 응답을 대조해 금일 회수채권이 출금성 이체 및 정산 지급 금액 제한에서 제외되는지 확인한다.",
  "roles": [
    "ADMIN",
    "VE"
  ],
  "subjectAccounts": [
    {
      "role": "VE",
      "application": "store",
      "envRole": "LUCY_VE",
      "label": "hsjve40"
    }
  ],
  "checklist": [
    "어드민 수기결제 화면에서 A_주홍석_일반법인 계정으로 수기결제를 진행한 뒤 해당 법인계좌에 회수채권이 표시되는지 확인",
    "법인계좌 간 이체 화면에서 금일 발생 회수채권이 있는 법인계좌는 잔액 범위 내 이체 시 금액 부족 안내 없이 이체가 완료되는지 확인",
    "법인계좌에서 지갑으로 이체할 때 금일 발생 회수채권이 금액 제한에 포함되지 않고 정상 이체되는지 확인",
    "법인계좌에서 지급계좌로 이체할 때 금일 발생 회수채권이 금액 제한에 포함되지 않고 정상 이체되는지 확인",
    "전일 또는 주말 이전 회수채권이 남아있는 법인계좌는 이체 가능 금액을 초과하면 금액 부족 안내가 보이고 이체가 생성되지 않는지 확인",
    "정산 처리 결과 화면에서 금일 발생 회수채권 때문에 정산 지급이 실패하지 않고 정상 처리되는지 확인",
    "정산 또는 이체 완료 후 법인계좌 잔액, 이체내역, 정산내역, 채권내역 화면의 금액이 서로 어긋나지 않는지 확인"
  ],
  "setupSteps": [
    {
      "name": "수기결제 생성 및 회수채권 발생",
      "kind": "data-create",
      "role": "VE",
      "application": "store",
      "description": "hsjve40 스토어 계정으로 수기결제를 실제 생성하고, ADMIN 계정으로 A_주홍석_일반법인의 채권관리/법인계좌관리 화면에서 회수채권 표시를 확인한다. 카드 정보는 .env.local의 QA_3518_* 또는 QA_3315_* 값을 사용한다.",
      "required": true,
      "mutation": "temporary",
      "guardEnv": "QA_3518_ALLOW_PAYMENT_MUTATION",
      "navigation": {
        "name": "스토어 수기결제",
        "path": "/face-to-face-payment"
      },
      "restore": {
        "required": true,
        "description": "이번 QA에서 생성한 수기결제는 증거 수집 후 PG 취소 API로 정리한다. 취소 결과는 qa-results runtime 로그에 남긴다.",
        "spec": "수기결제 생성 거래 ID, 금액, 채권/정산 확인 이후 PG 취소 결과를 보고서에 남긴다."
      }
    },
    {
      "name": "출금성 이체 실행 guard",
      "kind": "manual-precondition",
      "role": "ADMIN",
      "application": "admin",
      "description": "법인계좌 간/지갑/지급계좌 이체는 QA_3518_ALLOW_TRANSFER_MUTATION=1과 수신 대상 ID가 있을 때만 실제 실행한다. 대상 ID가 없으면 메뉴 접근과 가용 대상 조회를 증거로 남기고 테스트 조건 부족으로 분리한다.",
      "required": true,
      "mutation": "temporary",
      "guardEnv": "QA_3518_ALLOW_TRANSFER_MUTATION",
      "navigation": {
        "name": "법인계좌관리",
        "path": "/master-accounting/corporation-accounts"
      },
      "restore": {
        "required": true,
        "description": "출금성 이체는 개발계 소액으로만 실행한다. 별도 자동 취소 API가 없으므로 실행 결과, 이체내역, 법인계좌/지갑/지급계좌 잔액 증거를 남기고 필요 시 요청자/개발자가 테스트 데이터를 복구한다.",
        "spec": "실제 이체를 실행한 경우 transfer response와 이체내역/입출금내역 화면을 보고서에 첨부한다. 수신 대상 ID가 없으면 실제 이체를 실행하지 않고 BLOCKED로 분리한다."
      }
    }
  ],
  "pages": [
    {
      "name": "스토어 수기결제",
      "application": "store",
      "roles": [
        "VE"
      ],
      "path": "/face-to-face-payment",
      "tenantParam": "tenantId",
      "dataRequestUrlPattern": "store/identity/payment"
    },
    {
      "name": "법인계좌관리",
      "application": "admin",
      "roles": [
        "ADMIN"
      ],
      "path": "/master-accounting/corporation-accounts",
      "tenantParam": "tenantId",
      "dataRequestUrlPattern": "corporation-accounts"
    },
    {
      "name": "이체하기",
      "application": "admin",
      "roles": [
        "ADMIN"
      ],
      "path": "/account/remittance-manage",
      "tenantParam": "tenantId",
      "dataRequestUrlPattern": "transfer"
    },
    {
      "name": "지갑관리",
      "application": "admin",
      "roles": [
        "ADMIN"
      ],
      "path": "/master-accounting/wallet-management",
      "tenantParam": "tenantId",
      "dataRequestUrlPattern": "wallet"
    },
    {
      "name": "지갑 입출금 내역",
      "application": "admin",
      "roles": [
        "ADMIN"
      ],
      "path": "/master-accounting/wallet-inout-history",
      "tenantParam": "tenantId",
      "dataRequestUrlPattern": "wallet"
    },
    {
      "name": "이체내역",
      "application": "admin",
      "roles": [
        "ADMIN"
      ],
      "path": "/account/transfer-details",
      "tenantParam": "tenantId",
      "dataRequestUrlPattern": "transfer"
    },
    {
      "name": "정산내역",
      "application": "admin",
      "roles": [
        "ADMIN"
      ],
      "path": "/settlement-history/settlement-details",
      "tenantParam": "tenantId",
      "dataRequestUrlPattern": "settlement"
    },
    {
      "name": "채권관리",
      "application": "admin",
      "roles": [
        "ADMIN"
      ],
      "path": "/bond-management",
      "tenantParam": "tenantId",
      "dataRequestUrlPattern": "bond|debt"
    }
  ]
}
