{
  "issueId": "3201",
  "environment": "dev",
  "scenario": "biscuit-management-corporation-scope",
  "source": "Redmine #3201 + user-provided comparison re-QA checklist 2026-05-27",
  "sourceText": "류성열님의 QA 재요청입니다.\n\n조지민 프로님 안녕하세요, 비스킷 링크 개발계 비스킷관리 권한 범위 QA 재요청드립니다.\n\n[1] QA 요청 배경\nhttps://itsm.bix.bz/issues/3201\n비스킷관리 하위 6개 페이지에서 테넌트 권한 사용자가 본인이 선택한 법인 범위의 데이터만 조회할 수 있도록 백엔드 권한 범위 처리를 수정했습니다.\n연결계좌관리 메뉴 권한도 추가로 오픈되어 해당 화면 포함하여 재확인 요청드립니다.\n선택하지 않은 법인 범위의 카드/신청/수수료/통계/사용 내역이 다른 계정 화면에 섞여 노출되지 않는지 확인 요청드립니다.\n\n[2] 사전 데이터\n테넌트 권한 사용자 계정\n두 계정은 서로 다른 법인 범위를 가진 TA 계정입니다.\n\n두 개의 테넌트 계정으로 테스트합니다.\n- rsyTenant1: 최인석 법인(department.id = 11f1-2f1a-9276f266-b90a-000000000001)만 선택되어 있습니다.\n- rsyTenant2: 박재민 법인(department.id = 11f1-318a-34471f67-a20e-000000000001)만 선택되어 있습니다.\n\n주의:\n화면 데이터의 법인 소속 매핑은 별도로 제공하지 않습니다.\n이번 QA 기준은 개별 row가 어느 법인 소속인지 직접 판정하는 것이 아닙니다.\n서로 다른 법인 범위를 가진 두 TA 계정으로 동일 화면을 조회했을 때, 조회 결과가 계정별 접근 범위에 따라 분리되는지 확인합니다.\n즉, rsyTenant1과 rsyTenant2의 조회 결과가 동일하게 섞여 보이지 않는지 비교 확인하는 방식으로 진행합니다.\n실제 로그인 ID, 비밀번호, PIN은 로컬 .env.local 환경 변수로만 주입합니다.\n\n[3] 사전 작업\n테넌트 권한 사용자로 개발계 어드민 접속\n비스킷관리 메뉴 접근 가능 여부 확인\nrsyTenant1, rsyTenant2 각각 로그인하여 동일 메뉴 조회\n동일한 검색 조건에서 두 계정의 조회 결과를 비교\n\n검증 조건:\n두 계정 모두 조회 결과가 없어 비교가 불가능한 경우, 날짜/상태/검색 조건 등 필터를 조정하여 조회 결과가 있는 조건으로 재확인합니다.\n필터를 조정해도 양쪽 모두 데이터가 없는 경우에는 기능 실패가 아니라 테스트 데이터 부족으로 기록합니다.\n\n[4] 권한별 테스트\nTA\n\n[5] 검증 대상\n비스킷관리 > 연결계좌관리\n비스킷관리 > 비스킷카드관리\n비스킷관리 > 비스킷카드 신청관리\n비스킷관리 > 법인별 수수료 관리\n비스킷관리 > 카드통계\n비스킷관리 > 비스킷카드사용관리\n\n[6] 체크리스트\n연결계좌관리에서 rsyTenant1과 rsyTenant2의 조회 결과가 동일하게 노출되지 않고, 두 계정의 조회 결과가 서로 섞이지 않는지 확인\n비스킷카드관리에서 rsyTenant1과 rsyTenant2의 카드 목록이 동일하게 노출되지 않고, 두 계정의 카드 목록이 서로 섞이지 않는지 확인\n비스킷카드 신청관리에서 rsyTenant1과 rsyTenant2의 신청 내역이 동일하게 노출되지 않고, 두 계정의 신청 내역이 서로 섞이지 않는지 확인\n법인별 수수료 관리에서 rsyTenant1과 rsyTenant2의 수수료 정보가 동일하게 노출되지 않고, 두 계정의 수수료 정보가 서로 섞이지 않는지 확인\n카드통계에서 rsyTenant1과 rsyTenant2의 통계 결과가 동일하게 노출되지 않고, 두 계정의 통계 결과가 서로 섞이지 않는지 확인\n비스킷카드사용관리에서 rsyTenant1과 rsyTenant2의 사용 내역이 동일하게 노출되지 않고, 두 계정의 사용 내역이 서로 섞이지 않는지 확인",
  "scope": "dev TA 전용 테넌트 계정 rsyTenant1/rsyTenant2로 비스킷관리 하위 6개 화면을 동일 조건 조회해 두 계정의 결과가 동일하게 섞이지 않는지 비교 검증",
  "checklist": [
    "연결계좌관리에서 rsyTenant1과 rsyTenant2의 조회 결과가 동일하게 노출되지 않고, 두 계정의 조회 결과가 서로 섞이지 않는지 확인",
    "비스킷카드관리에서 rsyTenant1과 rsyTenant2의 카드 목록이 동일하게 노출되지 않고, 두 계정의 카드 목록이 서로 섞이지 않는지 확인",
    "비스킷카드 신청관리에서 rsyTenant1과 rsyTenant2의 신청 내역이 동일하게 노출되지 않고, 두 계정의 신청 내역이 서로 섞이지 않는지 확인",
    "법인별 수수료 관리에서 rsyTenant1과 rsyTenant2의 수수료 정보가 동일하게 노출되지 않고, 두 계정의 수수료 정보가 서로 섞이지 않는지 확인",
    "카드통계에서 rsyTenant1과 rsyTenant2의 통계 결과가 동일하게 노출되지 않고, 두 계정의 통계 결과가 서로 섞이지 않는지 확인",
    "비스킷카드사용관리에서 rsyTenant1과 rsyTenant2의 사용 내역이 동일하게 노출되지 않고, 두 계정의 사용 내역이 서로 섞이지 않는지 확인"
  ],
  "roles": [
    "TA"
  ],
  "subjectAccounts": [
    {
      "role": "TA",
      "label": "최인석 법인 전용 TA",
      "envRole": "RSY_TENANT1",
      "selectedCorporation": "최인석",
      "forbiddenCorporation": "박재민"
    },
    {
      "role": "TA",
      "label": "박재민 법인 전용 TA",
      "envRole": "RSY_TENANT2",
      "selectedCorporation": "박재민",
      "forbiddenCorporation": "최인석"
    }
  ],
  "routeCandidates": "../../../../qa-results/issues/3201/dev/route-candidates.json",
  "setupSteps": [
    {
      "name": "TA 계정 법인 범위 사전 데이터 확인",
      "kind": "manual-precondition",
      "role": "ADMIN",
      "application": "admin",
      "description": "rsyTenant1은 최인석 법인만, rsyTenant2는 박재민 법인만 선택된 상태여야 한다. 실제 로그인 ID, 비밀번호, PIN은 BIX_ADMIN_DEV_RSY_TENANT1_* / BIX_ADMIN_DEV_RSY_TENANT2_* 환경 변수로만 주입한다.",
      "required": true,
      "mutation": "none"
    }
  ],
  "pages": [
    {
      "name": "연결계좌관리",
      "application": "admin",
      "path": "/admin/biscuit-card/linked-account-setting",
      "tenantParam": "tenantId",
      "searchButtonSelector": "button:has-text('검색'), button:has-text('조회'), button[type='submit']",
      "dataRequestUrlPattern": "biscuit|account|linked|bank|corporation"
    },
    {
      "name": "비스킷카드관리",
      "application": "admin",
      "path": "/admin/biscuit-card/card-manage",
      "tenantParam": "tenantId",
      "searchButtonSelector": "button:has-text('검색'), button:has-text('조회'), button[type='submit']",
      "dataRequestUrlPattern": "biscuit|card|corporation"
    },
    {
      "name": "비스킷카드 신청관리",
      "application": "admin",
      "path": "/admin/biscuit-card/application-manage",
      "tenantParam": "tenantId",
      "searchButtonSelector": "button:has-text('검색'), button:has-text('조회'), button[type='submit']",
      "dataRequestUrlPattern": "biscuit|card|application|request|corporation"
    },
    {
      "name": "법인별 수수료 관리",
      "application": "admin",
      "path": "/admin/biscuit-card/corporation-commission",
      "tenantParam": "tenantId",
      "searchButtonSelector": "button:has-text('검색'), button:has-text('조회'), button[type='submit']",
      "dataRequestUrlPattern": "biscuit|commission|fee|corporation"
    },
    {
      "name": "카드통계",
      "application": "admin",
      "path": "/admin/statistics/biscuit-card-corporation",
      "tenantParam": "tenantId",
      "searchButtonSelector": "button:has-text('검색'), button:has-text('조회'), button[type='submit']",
      "dataRequestUrlPattern": "biscuit|statistics|card|corporation"
    },
    {
      "name": "비스킷카드사용관리",
      "application": "admin",
      "path": "/admin/biscuit-card/usage-history",
      "tenantParam": "tenantId",
      "searchButtonSelector": "button:has-text('검색'), button:has-text('조회'), button[type='submit']",
      "dataRequestUrlPattern": "biscuit|usage|history|card|corporation"
    }
  ]
}
