{
  "issueId": "3968",
  "environment": "dev",
  "scenario": "link-payment-tracking",
  "source": "Redmine #3968 final corrected request 1/2 through 2/2",
  "sourceText": "Redmine #3968 최종 정정본 1/2~2/2를 기준으로 수행한다. 이전 요청의 QA 담당자 직접 정상 결제 및 승인 실패 결제는 제외한다. 한결데테스트 VE로 신규 링크 1건을 발송해 생성 상태를 확인하고, 이미 준비된 생성·결제완료·실패 내역을 이용해 ADMIN/TA/CO/BO/VE 권한 범위, 목록 정보, 검색 필터, 페이징, 거래 상세 및 BO 제한 거래를 검증한다. 요청에 명시된 계정만 사용하며 인증정보는 공개 산출물에 기록하지 않는다.",
  "scope": "dev 환경에서 신규 링크 1건의 발송 및 CREATED 상태를 확인하고, 기존 링크발송내역으로 권한 범위·상태·필터·상세 조회를 검증한다. QA 중 카드 결제, 승인 실패 유도, PG 취소는 수행하지 않는다.",
  "checklist": [
    "ADMIN은 선택한 테넌트의 내역만 보이고 다른 테넌트 데이터가 섞이지 않는지 확인",
    "TA는 할당된 박재민_법인, 안법인과 해당 법인의 하위 가맹점 내역만 보이고 할당되지 않은 법인 내역은 보이지 않는지 확인",
    "CO는 접근 가능한 법인과 해당 법인의 하위 가맹점 내역만 보이고 접근 불가능한 법인 내역은 보이지 않는지 확인",
    "BO는 소속 영업점의 하위 가맹점 내역만 보이고 다른 영업점 또는 관계없는 가맹점 내역은 보이지 않는지 확인",
    "VE 한결데테스트는 비스킷페이에서 자기 가맹점 내역만 보이고 다른 가맹점이나 다른 테넌트 내역은 보이지 않는지 확인",
    "도둑가맹테스트로 비스킷페이 로그인 후 하단 내역에 링크발송내역 메뉴가 표시되지 않는지 확인",
    "한결데법인 CO 계정으로 비스킷페이 로그인 후 하단 내역에 링크발송내역 메뉴가 표시되지 않는지 확인",
    "VE 한결데테스트로 하단 결제 > 링크결제에서 구매자 전화번호 010-9446-9158과 기존 내역과 구분할 상품명·금액을 입력해 메시지를 전송하고 발송 시간을 확인",
    "메시지 전송 후 하단 내역 > 링크발송내역에서 전화번호와 발송 시간을 기준으로 신규 내역이 생성됐는지 확인",
    "신규 내역의 상태가 생성이고 전화번호·상품명·금액·생성 일시가 입력 및 발송 정보와 일치하는지 확인",
    "같은 시간대에 여러 건이면 전화번호·상품명·금액으로 신규 발송 건을 구분",
    "목록의 생성자가 로그인아이디(이름) 형식으로 표시되는지 확인",
    "CO 목록에는 법인 코드·법인명·가맹점 코드·가맹점명이 모두 표시되는지 확인",
    "BO 목록에는 법인 코드와 법인명이 표시되지 않고 가맹점 코드와 가맹점명부터 표시되는지 확인",
    "기존 생성·결제완료·실패 내역의 상태가 올바르게 표시되고 실패 건에는 사용자가 이해할 수 있는 실패 사유와 실패 처리 시간이 표시되는지 확인",
    "목록의 링크·수신 전화번호·상품명·금액과 화면에 제공되는 생성·시도·완료·실패 일시가 올바른지 확인",
    "기간에 대상 발송일을 포함하면 해당 건이 보이고 제외하면 보이지 않으며 기간 밖 내역이 섞이지 않는지 비스킷링크와 비스킷페이에서 확인",
    "생성·결제완료·실패 상태 필터에서 선택한 상태의 내역만 보이고 다른 상태가 섞이지 않는지 비스킷링크와 비스킷페이에서 확인",
    "상태를 여러 개 선택할 수 있다면 선택한 상태 중 하나에 해당하는 내역만 보이는지 확인",
    "링크 전체 또는 일부 문자열로 검색되고 존재하지 않는 링크로 검색하면 결과가 없는지 비스킷링크와 비스킷페이에서 확인",
    "수신 전화번호 전체 또는 일부로 검색되고 존재하지 않는 번호로 검색하면 결과가 없는지 비스킷링크와 비스킷페이에서 확인",
    "상품명 전체 또는 일부 문자열로 검색되고 존재하지 않는 상품명으로 검색하면 결과가 없는지 비스킷링크와 비스킷페이에서 확인",
    "비스킷링크에서 법인 필터 선택 시 해당 법인의 하위 가맹점 내역만 보이고 가맹점 필터 선택 시 해당 가맹점 내역만 보이는지 확인",
    "TA의 법인 선택 범위가 할당된 박재민_법인, 안법인으로 제한되는지 확인",
    "비스킷페이는 기간·상태·링크·전화번호·상품명을 함께 적용하고 비스킷링크는 법인·가맹점 조건까지 함께 적용했을 때 교집합으로 조회되는지 확인",
    "복합 조건 중 하나를 일치하지 않게 변경하면 대상 내역이 제외되는지 확인",
    "페이지 이동 또는 더보기 시 내역이 중복되거나 누락되지 않는지 확인",
    "기존 결제완료 건을 클릭하면 거래 상세가 열리고 화면의 금액·상태·결제 방식·상품명·가맹점 정보가 목록과 일치하는지 확인",
    "CO 거래 상세에서 계약명이 노출되지 않는지 확인",
    "BO 한결데영업으로 BP100060 박재민_가맹_한결데, 생성자 한결데테스트(김경주), 링크 4df87e058dae4e0, 전화번호 01091715730, 상품명 ㅇㅅㅇ, 1,004원 결제완료 수기 정상승인 건을 찾아 상세 조회",
    "위 BO 제한 거래의 상세를 조회하면 거래를 찾을 수 없습니다라고 표시되는지 확인"
  ],
  "roles": ["ADMIN", "TA", "CO", "BO", "VE"],
  "routeCandidates": "../../../../qa-results/issues/3968/dev/route-candidates.json",
  "subjectAccounts": [
    { "role": "ADMIN", "label": "bigs_jjm", "envRole": "ADMIN" },
    { "role": "TA", "label": "ta_test_gj", "envRole": "QA3968_TA", "selectedCorporation": "박재민_법인, 안법인" },
    { "role": "CO", "label": "한결데법인", "envRole": "QA3968_CO" },
    { "role": "BO", "label": "한결데영업", "envRole": "QA3968_BO" },
    { "role": "VE", "label": "한결데테스트", "envRole": "QA3968_VE" },
    { "role": "VE", "label": "도둑가맹테스트", "envRole": "QA3968_VE_NO_MENU" }
  ],
  "setupSteps": [
    {
      "name": "요청 지정 계정 로그인 세션 준비",
      "role": "ADMIN",
      "application": "admin",
      "kind": "manual-precondition",
      "description": "최종 정정본에 명시된 ADMIN/TA/CO/BO/VE 계정을 이슈 전용 envRole로 주입하고 세션을 새로 만든다. 기본 계정으로 대체하지 않는다.",
      "required": true,
      "mutation": "none"
    },
    {
      "name": "신규 링크 1건 발송",
      "role": "VE",
      "application": "store",
      "kind": "data-create",
      "description": "한결데테스트 계정으로 010-9446-9158에 식별 가능한 상품명과 금액의 링크 1건을 발송하고 CREATED 상태까지만 확인한다. 링크를 열거나 결제를 수행하지 않는다.",
      "required": true,
      "mutation": "persistent",
      "guardEnv": "QA_3968_ALLOW_LINK_MUTATION"
    }
  ],
  "pages": [
    {
      "name": "비스킷링크 링크발송내역",
      "application": "admin",
      "roles": ["ADMIN", "TA", "CO", "BO"],
      "path": "/link-payment",
      "tenantParam": "tenantId",
      "searchButtonSelector": "button:has-text('검색'), button:has-text('조회')",
      "dataRequestUrlPattern": "/api/v1/link-payment-trackings"
    },
    {
      "name": "비스킷페이 링크발송내역",
      "application": "store",
      "roles": ["VE", "CO"],
      "path": "/link-payment-trackings",
      "tenantParam": "tenantId",
      "searchButtonSelector": "button:has-text('조회')",
      "dataRequestUrlPattern": "/api/v1/store/link-payment-trackings"
    },
    {
      "name": "비스킷페이 링크결제 발송",
      "application": "store",
      "roles": ["VE"],
      "path": "/link-shop-setup",
      "tenantParam": "tenantId"
    },
    {
      "name": "비스킷링크 거래내역",
      "application": "admin",
      "roles": ["ADMIN", "CO", "BO"],
      "path": "/trade-history-v2",
      "tenantParam": "tenantId"
    },
    {
      "name": "비스킷페이 거래내역",
      "application": "store",
      "roles": ["VE"],
      "path": "/transactions",
      "tenantParam": "tenantId"
    }
  ]
}
