{
  "issueId": "3786",
  "environment": "dev",
  "scenario": "pg-mid-sales-line-excel-isp-users",
  "source": "Redmine #3786 + user-provided QA checklist 2026-07-09",
  "sourceText": "김경주님의 QA 요청입니다. TID/MID 관리 및 영업라인 엑셀 업로드/다운로드에 ISP 유형과 사용자 시트를 추가한 건입니다. 안법인/안가맹 데이터 기준으로 단말기 MID, 수기 MID, ISP MID의 다운로드/업로드 동작 확인이 필요합니다. Redmine: https://itsm.bix.bz/issues/3786. MID 업로드 파일: /Users/jimin/Downloads/안법인_윈글로벌_MID.xlsx. 영업라인 업로드 파일: /Users/jimin/Downloads/안가맹_영업라인.xlsx.",
  "scope": "dev 환경 ADMIN 계정으로 TID/MID 관리의 PG 윈글로벌/법인 안법인 ACTIVE 5건을 기준으로 수기/ISP 사용자 시트 다운로드와 업로드 복구를 검증하고, 가맹점관리 안가맹 영업라인에서 단말기/수기/ISP MID 영업라인 다운로드 및 업로드 반영을 검증한다.",
  "roles": [
    "ADMIN"
  ],
  "checklist": [
    "TID/MID 관리에서 PG 윈글로벌, 법인 안법인으로 검색 시 5건 목록이 조회되는지 확인",
    "5건의 수정 화면에서 기존 사용자 정보를 기록한 뒤 사용자를 모두 삭제할 수 있는지 확인",
    "MID 파일 안법인_윈글로벌_MID.xlsx 업로드 후 삭제했던 사용자가 동일하게 다시 추가되는지 확인",
    "MID 파일 업로드 후 대상 5건의 상태가 정상으로 유지되거나 정상으로 변경되는지 확인",
    "다운로드한 MID 파일에서 수기 사용자와 ISP 사용자가 각각 별도 사용자 시트로 내려오고, 업로드 후에도 연결 사용자가 유지되는지 확인",
    "WGP999618처럼 동일한 MID라도 계약 법인 이름이 서로 다르면 중복 오류 없이 처리되는지 확인",
    "MID_ISP, MID_ISP_사용자, MID_수기_사용자 시트가 없는 파일도 파일 형식 오류로 중단되지 않는지 확인",
    "사용자 저장 행이 없는 MID 업로드 파일은 실패 파일에서 사용자 로그인ID 필요 메시지가 확인되는지 확인",
    "가맹점관리에서 가맹점명 안가맹 선택 후 수정 화면의 영업라인 설정에 진입할 수 있는지 확인",
    "안가맹 영업라인 설정 화면에서 단말기 MID, 수기 MID, ISP MID 정보가 조회되는지 확인",
    "영업라인 파일 안가맹_영업라인.xlsx 업로드 후 단말기 MID 3건, 수기 MID 1건, ISP MID 1건의 영업라인 정보가 정상 반영되는지 확인",
    "영업라인 업로드 후 엑셀 다운로드를 다시 받아 안가맹 기준 단말기 MID, 수기 MID, ISP MID 영업라인 정보가 업로드 전후 기준과 맞는지 확인",
    "안법인/안가맹 부서 데이터 기준으로 단말기 MID, 수기 MID, ISP MID 각각의 목록 조회, 수정, 다운로드, 업로드 흐름이 정상 완료되는지 확인"
  ],
  "setupSteps": [
    {
      "name": "ADMIN 인증 상태 준비",
      "kind": "manual-precondition",
      "role": "ADMIN",
      "application": "admin",
      "description": "bigs_jjm ADMIN 계정으로 개발계 로그인 가능 상태와 storageState를 준비한다.",
      "required": true,
      "mutation": "none"
    },
    {
      "name": "MID 사용자 연결 삭제/복구 허용",
      "kind": "data-update",
      "role": "ADMIN",
      "application": "admin",
      "description": "TID/MID 대상 5건의 연결 사용자를 삭제한 뒤 MID 엑셀 업로드로 복구하는 검증이다. 실패 시 백업한 사용자 ID로 원복한다.",
      "required": true,
      "mutation": "temporary",
      "guardEnv": "QA_3786_ALLOW_MID_USER_MUTATION",
      "restore": {
        "required": true,
        "description": "QA 종료 시 삭제 전 기록한 keyinUsers 사용자 ID 목록으로 대상 5건의 사용자 연결을 다시 저장한다."
      }
    },
    {
      "name": "업로드 원본 파일 확인",
      "kind": "manual-precondition",
      "role": "ADMIN",
      "application": "admin",
      "description": "/Users/jimin/Downloads/안법인_윈글로벌_MID.xlsx 및 /Users/jimin/Downloads/안가맹_영업라인.xlsx 파일이 존재해야 한다.",
      "required": true,
      "mutation": "none"
    }
  ],
  "pages": [
    {
      "name": "TID/MID 관리",
      "application": "admin",
      "roles": [
        "ADMIN"
      ],
      "path": "/business/pg-mid-manage",
      "tenantParam": "tenantId",
      "searchButtonSelector": "button:has-text('검색'), button:has-text('조회')",
      "recordsSelector": "table tbody tr, [role='row']",
      "excelDownloadButtonSelector": "button:has-text('엑셀')",
      "dataRequestUrlPattern": "/api/v1/pgmids/manage",
      "excelResponseUrlPattern": "/api/v1/excel/pg-mids"
    },
    {
      "name": "가맹점관리",
      "application": "admin",
      "roles": [
        "ADMIN"
      ],
      "path": "/business/vendor-manage",
      "tenantParam": "tenantId",
      "searchButtonSelector": "button:has-text('검색'), button:has-text('조회')",
      "recordsSelector": "table tbody tr, [role='row']",
      "excelDownloadButtonSelector": "button:has-text('엑셀')",
      "dataRequestUrlPattern": "/api/v2/sales-lines/departments",
      "excelResponseUrlPattern": "/api/v1/excel/sales-lines"
    }
  ]
}
