{
  "issueId": "4075",
  "environment": "dev",
  "scenario": "merchant-created-at-sort",
  "source": "Redmine #4075 + user-provided QA checklist 2026-09-08",
  "sourceText": "김경주님의 QA 요청입니다. 개발계 비스킷링크에서 ADMIN, TA, CO, BO 계정으로 업체관리 > 가맹점관리 > 가맹점관리의 등록일시 정렬을 검증한다. 정렬 옵션 노출, 오래된순/최신순, 상호 배타 선택, 미선택 또는 초기화 시 가맹점명 오름차순, 다른 필터와의 결합, 검색 조건 변경 시 첫 페이지 초기화, 다음 페이지 정렬 유지와 동률 데이터 중복·누락 여부를 확인한다. 요청에 별도 계정이 없으므로 문서화된 기본 계정 ADMIN bigs_jjm, TA jjmta01, CO jjmco01, BO jjmbo01을 사용한다.",
  "scope": "개발계 비스킷링크 가맹점관리에서 ADMIN, TA, CO, BO 역할별 등록일시 정렬 UI와 목록 API 정렬을 검증하고, ADMIN의 2페이지 이상 데이터로 cursor 페이지 경계의 중복·누락을 확인한다.",
  "checklist": [
    "필터 영역의 정렬에 등록일시 오래된순, 등록일시 최신순이 표시되는지 확인",
    "등록일시 오래된순을 선택하고 검색 버튼 클릭 시 등록일시가 오래된 가맹점부터 표시되는지 확인",
    "등록일시 최신순을 선택하고 검색 버튼 클릭 시 등록일시가 최신인 가맹점부터 표시되는지 확인",
    "등록일시 오래된순 선택 후 등록일시 최신순을 선택하면 최신순만 선택되는지 확인하고, 검색 버튼 클릭 시 최신순으로 표시되는지 확인",
    "등록일시 최신순 선택 후 등록일시 오래된순을 선택하면 오래된순만 선택되는지 확인하고, 검색 버튼 클릭 시 오래된순으로 표시되는지 확인",
    "정렬을 선택하지 않거나 선택한 정렬을 해제한 뒤 검색 버튼 클릭 시 기존과 동일하게 가맹점명 오름차순으로 표시되는지 확인",
    "법인, 영업점, 상태, 정산방식 등 다른 필터를 단독 또는 함께 선택하고 검색 버튼 클릭 시 선택한 등록일시 정렬이 유지되는지 확인",
    "검색 조건 또는 정렬을 변경하고 검색 버튼 클릭 시 첫 페이지부터 조회되는지 확인",
    "다음 페이지로 이동해도 정렬 순서가 유지되고, 가맹점명이 같거나 등록일시가 같은 가맹점이 중복 또는 누락되지 않는지 확인"
  ],
  "roles": [
    "ADMIN",
    "TA",
    "CO",
    "BO"
  ],
  "subjectAccounts": [
    {
      "role": "ADMIN",
      "label": "bigs_jjm",
      "envRole": "ADMIN"
    },
    {
      "role": "TA",
      "label": "jjmta01",
      "envRole": "TA"
    },
    {
      "role": "CO",
      "label": "jjmco01",
      "envRole": "CO"
    },
    {
      "role": "BO",
      "label": "jjmbo01",
      "envRole": "QA4075_BO"
    }
  ],
  "setupSteps": [
    {
      "name": "권한별 개발계 로그인 및 가맹점관리 접근",
      "kind": "state-verify",
      "role": "ADMIN",
      "targetRoles": [
        "ADMIN",
        "TA",
        "CO",
        "BO"
      ],
      "application": "admin",
      "description": "요청에 별도 계정이 없으므로 기본 계정 ADMIN bigs_jjm, TA jjmta01, CO jjmco01, BO jjmbo01로 로그인하고 업체관리 > 가맹점관리 화면에 접근한다. BO는 전역 기본 role 설정을 변경하지 않고 #4075 전용 런타임 별칭에 jjmbo01을 연결한다.",
      "required": true,
      "mutation": "none",
      "navigation": {
        "name": "가맹점관리",
        "path": "/business/vendor-manage"
      }
    },
    {
      "name": "정렬 및 페이지 경계 검증 데이터 확인",
      "kind": "manual-precondition",
      "role": "ADMIN",
      "targetRoles": [
        "ADMIN",
        "TA",
        "CO",
        "BO"
      ],
      "application": "admin",
      "description": "등록일시와 가맹점명 순서가 다르고 상태·정산방식이 다른 데이터가 있어야 한다. ADMIN 범위에는 2페이지 이상과 동일 등록일시 데이터가 있어야 하며 시나리오가 목록 API에서 동적으로 확인한다.",
      "required": true,
      "mutation": "none"
    }
  ],
  "pages": [
    {
      "name": "가맹점관리",
      "application": "admin",
      "path": "/business/vendor-manage",
      "tenantParam": "tenantId",
      "roles": [
        "ADMIN",
        "TA",
        "CO",
        "BO"
      ],
      "recordsSelector": "[role='grid']",
      "searchButtonSelector": "button:has-text('검색')",
      "dataRequestUrlPattern": "/api/v2/vendors/manage",
      "filters": [
        {
          "name": "정렬",
          "selector": "[role='combobox'][aria-labelledby*='label']",
          "type": "combobox",
          "value": "CREATED_AT_ASC|CREATED_AT_DESC",
          "queryParamCandidates": [
            "sorts"
          ]
        }
      ]
    }
  ]
}
