{
  "issueId": "4046",
  "environment": "dev",
  "scenario": "tax-vat-report-consistency",
  "source": "김경주 QA 요청 / Redmine #4046",
  "sourceText": "김경주 재QA 요청: 거래 삭제 관련 데이터 3건·10,200원을 정리하고 TA 합계 조회 권한을 수정했으므로 기존 실패 항목을 재검증한다. 추가 요청: '확인불가도 다시 확인해야지'. ADMIN은 BP100002의 2026-08 과세자료와 거래내역에서 승인 30건·2,546,428원, 취소 15건·466,720원, 총 45건·2,079,708원이 일치하는지 확인한다. TA는 월 변경·검색 초기화 시 목록과 합계 갱신, 과세자료 전체 행의 승인·취소·총 건수 및 금액 합산, 부가세 신고자료 전체 행의 총매출·공급가액·VAT·수수료 합산, 전체 수수료 재계산이 아닌 가맹점별 공급가액·VAT의 합산, 빈 결과 목록과 모든 합계 0을 확인한다. 기존 확인 불가였던 ADMIN/TA의 페이지 추가 로딩·4개 사업자 유형·등록번호 빈값 및 비사업자 주민등록번호·직가맹/미등록/복수 영업라인·추가 로딩 시 합계 유지와 TA 반복 부분취소 자료도 다시 확인한다. 기존 28개 체크리스트 원문은 아래에 보존하며 실제 재실행 선택은 spec의 retest 옵션으로 제한한다.",
  "scope": "DEV 기본 ADMIN·TA 계정으로 기존 실패 6건과 확인 불가 11건, 총 17건만 재QA한다. ADMIN 원 체크리스트 5,6,7,9,11,26번과 TA 2,5,6,7,9,11,22,23,24,25,26번이 대상이다. ADMIN 11번은 정정된 BP100002의 승인·취소·총액까지 검증한다. 기존 통과 39건은 재실행하지 않고 이전 리포트의 이력으로 보존한다. 이번 결과 건수는 재실행 17건 기준이며 기존 확인 불가를 임의로 통과 처리하지 않는다. 기준 월은 2026-08이며 경계 데이터는 2025-01~2026-08 전체 페이지와 TA 거래내역을 다시 조회한다. 결제·취소·가맹점·권한 변경 없이 읽기 전용으로 검증한다.",
  "checklist": [
    "거래관리 > 과세자료와 거래관리 > 부가세 신고자료 화면에 ADMIN과 TA로 접근하여 조회할 수 있는지 확인",
    "조회 월 변경과 검색 조건 초기화 시 목록과 합계가 함께 갱신되는지 확인",
    "법인 고유코드·법인명·영업점 고유코드·영업점명·가맹 고유코드·가맹점명 검색 결과가 맞는지 확인",
    "등록번호 하이픈 포함 검색, 사업자 유형, 신고 여부 및 복합 검색 결과가 맞는지 확인",
    "다음 목록을 불러올 때 중복·누락이 없고 전체 건수와 행 번호가 맞는지 확인",
    "사업자 유형이 설정 안 함·비사업자·개인사업자·법인사업자로 올바르게 표시되는지 확인",
    "비사업자는 주민등록번호, 나머지 사업자 유형은 사업자번호로 표시되고 값이 없으면 대시로 표시되는지 확인",
    "영업라인이 BP 코드 배지와 부서명으로 법인-상위 영업점-하위 영업점-가맹점 순서로 표시되는지 확인",
    "직가맹은 법인-가맹점 순서, 영업라인 미등록은 빈 상태, 여러 영업라인은 가장 먼저 등록된 영업라인으로 표시되는지 확인",
    "거래관리 > 과세자료에서 확인할 가맹점과 월을 정한 뒤 거래관리 > 거래내역에서 동일 가맹점·동일 월을 검색하여 승인 건수와 승인금액이 일치하는지 확인",
    "거래관리 > 거래내역의 부분취소를 포함한 취소 발생 횟수와 취소 금액을 기준으로 과세자료의 취소 건수와 양수 취소금액이 일치하는지 확인",
    "취소 거래는 원승인 월이 아니라 실제 취소가 발생한 조회 월에 포함되는지 확인",
    "과세자료 총 건수=승인 건수+취소 건수 식으로 화면 값을 계산하여 일치하는지 확인",
    "과세자료 총 거래금액=승인금액-취소금액 식으로 화면 값을 계산하여 일치하는지 확인",
    "거래관리 > 부가세 신고자료에서 확인할 가맹점과 월을 정한 뒤 거래관리 > 거래내역에서 동일 가맹점·동일 월을 검색하여 총매출=승인금액-취소금액과 일치하는지 확인",
    "부가세 신고자료 수수료 합계가 해당 가맹점에서 공제된 월 수수료 합계와 일치하는지 확인",
    "수수료 VAT=수수료 합계×0.090909 계산 후 소수점 이하 버림 식으로 화면 값을 계산하여 일치하는지 확인",
    "수수료 공급가액=수수료 합계-VAT 식으로 계산하고 공급가액+VAT=수수료 합계로 검산되는지 확인",
    "총매출은 수수료 공급가액 계산에 직접 사용되지 않고 수수료 합계를 기준으로 공급가액과 VAT를 나누는지 확인",
    "부가세 신고자료의 대표자명·업태·종목·주소가 가맹점 정보와 일치하고 우편번호가 괄호로 표시되는지 확인",
    "입력되지 않은 업태·종목과 현재 빈값으로 제공되는 이메일이 대시로 표시되는지 확인",
    "과세자료 합계의 각 건수와 금액이 현재 검색 결과 전체 행을 더한 값과 일치하는지 확인",
    "부가세 신고자료 합계의 총매출·공급가액·VAT·수수료가 현재 검색 결과 전체 행을 각각 더한 값과 일치하는지 확인",
    "부가세 합계는 전체 수수료로 VAT를 다시 계산한 값이 아니라 가맹점별 공급가액과 VAT를 각각 더한 값인지 확인",
    "검색 결과가 없을 때 목록은 비어 있고 합계 영역의 모든 건수와 금액이 0인지 확인",
    "목록을 추가로 불러올 때 합계가 중복 누적되거나 변경되지 않는지 확인",
    "엑셀 다운로드가 완료되고 조회 월·검색 조건·목록 표시값이 화면과 일치하는지 확인",
    "엑셀의 가맹점명·가맹 고유코드 순서, 영업라인, 사업자 유형, 등록번호, 거래·수수료 금액이 화면과 일치하는지 확인"
  ],
  "roles": [
    "ADMIN",
    "TA"
  ],
  "setupSteps": [],
  "pages": [
    { "name": "과세자료", "application": "admin", "path": "/tax-reports/taxable-materials", "tenantParam": "tenantId", "searchButtonSelector": "button:has-text('검색')", "filters": [] },
    { "name": "부가세 신고자료", "application": "admin", "path": "/tax-reports/vat-reports", "tenantParam": "tenantId", "searchButtonSelector": "button:has-text('검색')", "filters": [] },
    { "name": "거래내역", "application": "admin", "path": "/trade-history-v2", "tenantParam": "tenantId", "searchButtonSelector": "button:has-text('검색')", "filters": [] },
    { "name": "가맹점관리", "application": "admin", "path": "/business/vendor-manage", "tenantParam": "tenantId", "searchButtonSelector": "button:has-text('검색')", "filters": [] },
    { "name": "문서보관함", "application": "admin", "path": "/document", "tenantParam": "tenantId", "searchButtonSelector": "button:has-text('검색')", "filters": [] }
  ]
}
