{
  "issueId": "3289",
  "environment": "dev",
  "scenario": "access-history-permission",
  "source": "Redmine #3289 + user-provided re-QA checklist 2026-05-27",
  "sourceText": "주홍석 재 QA\n주홍석님의 QA 요청입니다\n조지민 프로님 안녕하세요, 비스킷 링크 개발계 QA 요청드립니다\n[1] QA 요청 배경\n- https://itsm.bix.bz/issues/3289\n- QA 리포트 3289 개발계 실패건 재확인 요청입니다. TA 계정은 권한 프리셋 반영 후 영업라인 변경이력 버튼/화면 접근 실패 3건을 재확인하고, BO 계정은 엑셀 생성 실패 1건을 재확인 부탁드립니다. 백엔드 권한 SQL과 develop-rc 반영 여부, 변경 대상 컴파일은 확인했습니다.\n[2] 사전 데이터\n- QA 리포트에서 사용한 영업라인 변경이력 검증 대상 가맹점/계약 데이터 유지\n[3] 사전 작업\n- TA 계정에 영업라인 변경이력 조회 권한 프리셋이 반영되어 있는지 확인\n- 개발계에 develop-rc 최신 배포와 엑셀 컨슈머 재기동/반영 여부 확인\n[4] 권한별 테스트\n- ta\n- bo\n[5] 검증 대상\n- 업체관리 > 가맹점관리 화면\n- 영업라인 변경이력 화면\n- 다운로드 이력 화면\n[6] 체크리스트\n- TA 계정에서 업체관리 > 가맹점관리 화면의 영업라인 변경이력 버튼이 보이고 변경이력 화면에 진입되는지 확인\n- TA 계정에서 권한 범위의 변경이력만 노출되고 기존 실패 항목 3건이 통과하는지 확인\n- BO 계정에서 영업라인 변경이력 엑셀 다운로드 요청 후 다운로드 이력에서 생성 상태가 실패가 아닌 사용 가능 상태가 되는지 확인\n- BO 계정에서 내려받은 엑셀에 계약 ID 컬럼이 없고 계약 이름 기준으로 같은 계약 이력이 묶여 보이는지 확인\n\n실행 보고서에서는 TA 엑셀 접근 실패 재확인과 BO 엑셀 생성/파일 내용 재확인을 함께 판정하기 위해 엑셀 관련 항목을 TA/BO 공통 항목으로 묶어 표시합니다.",
  "scope": "비스킷 링크 개발계 영업라인 변경이력 기존 실패건 재확인입니다. TA는 권한 프리셋 반영 후 버튼/화면 진입과 권한 범위 노출을 확인하고, BO는 엑셀 생성 및 파일 내용을 재확인합니다.",
  "checklist": [
    "권한이 있는 TA 계정에서 업체관리 > 가맹점관리 화면의 영업라인 변경이력 버튼이 보이고 변경이력 화면에 진입되는지 확인",
    "TA 계정에서 권한 범위의 변경이력만 노출되고 기존 접근 실패 항목이 통과하는지 확인",
    "TA/BO 계정에서 영업라인 변경이력 엑셀 다운로드 요청 후 다운로드 이력에서 생성 상태가 실패가 아닌 사용 가능 상태가 되는지 확인",
    "TA/BO 계정에서 내려받은 엑셀에 계약 ID 컬럼이 없고 계약 이름 기준으로 같은 계약 이력이 묶여 보이는지 확인"
  ],
  "roles": [
    "TA",
    "BO"
  ],
  "routeCandidates": "../../../../qa-results/issues/3289/dev/route-candidates.json",
  "setupSteps": [
    {
      "name": "TA 권한 프리셋 및 BO 엑셀 처리 상태 확인",
      "kind": "manual-precondition",
      "role": "ADMIN",
      "application": "admin",
      "targetRoles": [
        "TA",
        "BO"
      ],
      "description": "TA 계정에 영업라인 변경이력 조회 권한 프리셋이 반영되어 있어야 합니다. 개발계에는 develop-rc 최신 배포와 엑셀 컨슈머 재기동/반영이 완료되어 있어야 합니다.",
      "required": true,
      "mutation": "none",
      "evidence": [
        {
          "name": "기존 실패건 재확인 범위",
          "description": "TA 변경이력 버튼/화면 접근 실패 3건과 BO 엑셀 생성 실패 1건을 재검증합니다."
        }
      ]
    }
  ],
  "pages": [
    {
      "name": "영업라인 변경이력",
      "application": "admin",
      "path": "/business/vendor-manage",
      "tenantParam": "tenantId",
      "accessByRole": {
        "TA": "allowed",
        "BO": "allowed"
      },
      "accessDeniedText": [
        "권한이 없습니다",
        "접근 권한",
        "접근이 제한",
        "Forbidden",
        "Unauthorized",
        "404"
      ],
      "historyButtonSelector": "button[aria-label=\"영업라인 변경이력\"]",
      "recordsSelector": "table tbody tr, [role='row']",
      "detailOpenSelector": "[data-field=\"salesLineCount\"] button:not([aria-label]), span[aria-label=\"현재 영업라인 조회\"] button",
      "memberListSelector": "body",
      "excelDownloadButtonSelector": "button:has-text(\"엑셀 다운로드\")",
      "excelQueuedSuccessText": [
        "엑셀요청이 완료되었습니다",
        "문서보관함에서 확인"
      ],
      "excelDocumentPath": "/document",
      "excelDocumentFileNameIncludes": "영업라인변경이력",
      "excelDocumentDownloadSelector": "a:has-text(\"다운로드\"), button:has-text(\"다운로드\"), [role='button']:has-text(\"다운로드\")",
      "excelResponseUrlPattern": "\\.xlsx(\\?|$)|cloudflarestorage.*excel",
      "excelDirectDownloadTimeoutMs": 5000,
      "excelDocumentReadyTimeoutMs": 60000,
      "excelExpectedColumnHeaders": [
        "계약 이름"
      ],
      "excelForbiddenColumnHeaders": [
        "계약 ID"
      ],
      "excelGroupByColumnHeader": "계약 이름",
      "excelRequireRepeatedGroup": true,
      "expectedVisibleTextsByRole": {
        "TA": [
          "영업라인 변경이력 -",
          "A_주홍석_가맹1",
          "A_주홍석_법인",
          "윈글로벌",
          "BP100482"
        ],
        "BO": [
          "영업라인 변경이력 -",
          "A_주홍석_가맹1",
          "A_주홍석_영업1",
          "BP100483"
        ]
      },
      "forbiddenVisibleTextsByRole": {
        "TA": [],
        "BO": [
          "A_주홍석_법인",
          "BP100482",
          "윈글로벌"
        ]
      },
      "excelExpectedVisibleTextsByRole": {
        "TA": [
          "A_주홍석_가맹1",
          "A_주홍석_법인"
        ],
        "BO": [
          "A_주홍석_가맹1",
          "A_주홍석_영업1"
        ]
      },
      "excelForbiddenVisibleTextsByRole": {
        "TA": [
          "계약 ID"
        ],
        "BO": [
          "계약 ID"
        ]
      },
      "detailExpectedVisibleTextsByRole": {
        "TA": [
          "A_주홍석_법인",
          "A_주홍석_영업1"
        ],
        "BO": [
          "총 1개",
          "A_주홍석_영업1",
          "A_주홍석_영업3",
          "BP100485",
          "A_주홍석_가맹1"
        ]
      },
      "detailForbiddenVisibleTextsByRole": {
        "TA": [],
        "BO": [
          "A_주홍석_법인",
          "BP100482",
          "윈글로벌"
        ]
      },
      "roles": [
        "TA",
        "BO"
      ]
    }
  ]
}
