{
  "issueId": "3951",
  "environment": "dev",
  "scenario": "negative-settlement-deduction",
  "source": "Redmine #3951 + user-provided settlement data",
  "sourceText": "김경주님의 QA 요청입니다. 개발계 2026년 8월 박재민_법인/박재민_가맹의 일반정산·선정산 양수, 거래 연결 음수 취소, 거래 없는 음수 채권 정산을 완료 처리한 뒤 관리자 정산내역, 일반·선정산 법인계좌 월별 공제금, 가맹점 정산내역과 지갑내역을 대조한다. 음수 취소는 부가세와 사업소득세 공제금이 음수로 반영되고, 거래 없는 음수 채권은 공제금 0원이어야 하며, 일반·선정산 계좌가 섞이지 않아야 한다. 가맹점 계정은 제공된 transfer_ve_gj 세션을 사용한다.",
  "scope": "개발계 ADMIN/VE 기준으로 박재민_가맹의 2026년 8월 일반·선정산 정산과 음수 공제금 처리 결과를 화면/API/지갑내역으로 대조한다.",
  "roles": [
    "ADMIN",
    "VE"
  ],
  "subjectAccounts": [
    {
      "role": "VE",
      "label": "transfer_ve_gj / 박재민_가맹",
      "envRole": "QA3951_VE"
    }
  ],
  "checklist": [
    "관리자 정산내역에서 박재민_가맹의 2026년 8월 양수·음수 취소·음수 채권 정산과 일반/선정산 법인계좌가 준비되어 있는지 확인",
    "일반 양수 공제금 +44,607원, 일반 음수 취소 공제금 -11,151원, 선정산 양수 공제금 +34,694원, 선정산 음수 취소 공제금 -22,303원을 확인하고 거래 없는 음수 채권의 공제금이 0원인지 확인",
    "실험실 > 법인계좌관리V2에서 박재민 법인계좌와 박재민 선정산계좌를 분리해 2026년 8월 정산 전 월별 공제금 기준을 기록",
    "transfer_ve_gj로 비스킷페이에 로그인해 정산 완료 전 지갑 잔액과 정산예정금·정산대기금을 기록",
    "준비된 일반·선정산 양수, 음수 취소, 음수 채권 6건을 지급·전산완료 처리",
    "정산 완료 후 일반정산 월별 공제금이 대상 4건·33,456원, 선정산 월별 공제금이 대상 4건·12,391원 증가하고 음수 채권은 공제금 대상에서 제외되는지 확인",
    "관리자 정산내역 재조회에서 6건이 완료 상태가 되고 공제 후 지급 금액이 일반 +315,393원/-78,849원, 선정산 +245,306원/-157,697원, 음수 채권 각 -10,000원인지 확인",
    "비스킷페이 정산내역과 지갑내역에서 일반·선정산 대금지급 및 음수 금액이 각각 표시되는지 확인",
    "정산 전후 가맹점 지갑 잔액 차이가 전체 대금지급 합계 +304,153원이고 음수 지급이 '-' 부호로 표시되는지 확인",
    "관리자·가맹점 화면을 새로고침한 뒤 일반/선정산 공제금, 정산 금액, 지갑 잔액과 음수 이력이 동일하게 유지되는지 확인"
  ],
  "setupSteps": [
    {
      "name": "ADMIN 정산·법인계좌 데이터 접근",
      "kind": "manual-precondition",
      "role": "ADMIN",
      "application": "admin",
      "description": "개발계 ADMIN으로 정산관리 > 정산내역과 실험실 > 법인계좌관리V2에 접근하고 박재민_가맹/박재민 법인 데이터를 조회할 수 있어야 한다.",
      "required": true,
      "mutation": "none",
      "navigation": {
        "name": "정산내역",
        "path": "/settlement-history/settlement-details"
      }
    },
    {
      "name": "VE 정산 전 지갑 기준 기록",
      "kind": "manual-precondition",
      "role": "VE",
      "application": "store",
      "description": "transfer_ve_gj 세션으로 비스킷페이 정산내역과 지갑내역에 접근해 정산 전 기준 금액을 기록한다. 런타임에서는 QA3951_VE storage state만 사용한다.",
      "required": true,
      "mutation": "none",
      "navigation": {
        "name": "스토어 지갑내역",
        "path": "/wallets"
      }
    },
    {
      "name": "준비된 6건 지급·전산완료",
      "kind": "state-verify",
      "role": "ADMIN",
      "application": "admin",
      "description": "대상 정산 6건만 지급·전산완료 처리하고, 5xx/no healthy upstream 응답은 제품 실패가 아닌 환경 확인 불가로 기록한다.",
      "required": true,
      "mutation": "persistent",
      "guardEnv": "QA_3951_ALLOW_SETTLEMENT_PAYMENT",
      "navigation": {
        "name": "정산내역",
        "path": "/settlement-history/settlement-details"
      }
    }
  ],
  "pages": [
    {
      "name": "어드민 법인계좌관리V2",
      "application": "admin",
      "path": "/lab/corporation-accounts-v2",
      "tenantParam": "tenantId",
      "roles": [
        "ADMIN"
      ],
      "dataRequestUrlPattern": "corporation-accounts",
      "recordsSelector": "body"
    },
    {
      "name": "어드민 정산내역",
      "application": "admin",
      "path": "/settlement-history/settlement-details",
      "tenantParam": "tenantId",
      "roles": [
        "ADMIN"
      ],
      "dataRequestUrlPattern": "settlement",
      "recordsSelector": "body"
    },
    {
      "name": "스토어 정산내역",
      "application": "store",
      "path": "/settlements",
      "tenantParam": "tenantId",
      "roles": [
        "VE"
      ],
      "dataRequestUrlPattern": "store/settlements",
      "recordsSelector": "body"
    },
    {
      "name": "스토어 지갑내역",
      "application": "store",
      "path": "/wallets",
      "tenantParam": "tenantId",
      "roles": [
        "VE"
      ],
      "dataRequestUrlPattern": "store/wallets",
      "recordsSelector": "body"
    }
  ]
}
