{
  "issueId": "4090",
  "environment": "dev",
  "scenario": "transaction-manual-cancel-modal",
  "source": "Redmine #4090 + user-provided QA checklist 2026-09-10",
  "sourceText": "송인준 요청입니다. 개발계 비스킷링크에서 ADMIN, TA, CO, BO 계정으로 거래관리 > 거래내역에 진입해 거래일시 2026-03-01~2026-09-10, 상태 승인 조건으로 조회하고 전산취소 모달의 전체취소·부분취소 선택과 취소금액 및 취소신청 버튼 상태를 검증합니다. Redmine: https://itsm.bix.bz/issues/4090",
  "scope": "개발계 비스킷링크 거래관리 > 거래내역에서 ADMIN, TA, CO, BO 권한별 승인 거래의 전산취소 모달을 열어 전체취소 시 금액 자동 입력, 부분취소 시 금액 공란 및 입력 전후 취소신청 버튼 활성화 상태를 비파괴 방식으로 검증한다.",
  "roles": ["ADMIN", "TA", "CO", "BO"],
  "subjectAccounts": [
    { "role": "ADMIN", "label": "ADMIN 개발계 기본 계정", "envRole": "ADMIN" },
    { "role": "TA", "label": "TA 개발계 기본 계정", "envRole": "TA" },
    { "role": "CO", "label": "CO 개발계 기본 계정", "envRole": "CO" },
    { "role": "BO", "label": "BO 개발계 기본 계정", "envRole": "BO" }
  ],
  "checklist": [
    "전산취소 컬럼의 전산취소 버튼 클릭 후 전체취소, 부분취소 선택 모달 확인",
    "전체취소 클릭 시 취소 금액 자동 입력 확인",
    "부분취소 클릭 시 취소 금액 공란 확인 후 입력해야 취소신청 버튼 활성화 확인"
  ],
  "setupSteps": [
    {
      "name": "권한별 개발계 로그인 및 거래내역 접근",
      "kind": "state-verify",
      "role": "ADMIN",
      "targetRoles": ["ADMIN", "TA", "CO", "BO"],
      "application": "admin",
      "description": "개발계 기본 ADMIN, TA, CO, BO 계정으로 로그인하고 거래관리 > 거래내역 화면에 접근한다.",
      "required": true,
      "mutation": "none",
      "navigation": { "name": "거래내역", "path": "/trade-history-v2" }
    },
    {
      "name": "권한별 승인 거래 전산취소 대상 확인",
      "kind": "manual-precondition",
      "role": "ADMIN",
      "targetRoles": ["ADMIN", "TA", "CO", "BO"],
      "application": "admin",
      "description": "2026-03-01~2026-09-10 승인 거래 중 전산취소 버튼이 노출되는 거래가 각 권한 조회 범위에 최소 1건 있어야 한다. 실제 취소신청은 제출하지 않는다.",
      "required": true,
      "mutation": "none"
    }
  ],
  "pages": [
    {
      "name": "거래내역",
      "application": "admin",
      "path": "/trade-history-v2",
      "tenantParam": "tenantId",
      "roles": ["ADMIN", "TA", "CO", "BO"],
      "recordsSelector": "[role='grid']",
      "searchButtonSelector": "button:has-text('검색'), button:has-text('조회')",
      "dataRequestUrlPattern": "/api/v2/transactions",
      "filters": [
        {
          "name": "거래일시",
          "type": "textbox",
          "value": "2026-03-01~2026-09-10",
          "queryParamCandidates": ["from", "to"]
        },
        {
          "name": "상태",
          "label": "상태",
          "type": "combobox",
          "value": "승인",
          "queryParamCandidates": ["status"]
        }
      ]
    }
  ]
}
