{
  "issueId": "4220",
  "environment": "dev",
  "source": "Redmine #4220 및 2026-10-12~13 개발계 QA 실행 기록",
  "sourceText": "동일 PG사 및 타 PG사 계약 변경 시 MID와 KEY를 수정할 수 있어야 한다. MID를 변경하지 않으면 기존 값을 유지한다. 배포 후 변경 요약, 미저장 입력 안내, 단건 이동을 재검증한다.",
  "scope": "개발계 ADMIN의 MID 계약 변경. 선택 입력 항목 삭제와 실제 결제/PG 승인은 합의에 따라 제외.",
  "checklist": [
    "계약 미선택 시 기존 계약 유지, MID·PG 설정별 연동정보 독립 수정 및 입력 유효성",
    "타 PG 이동 시 MID와 PG 설정별 필수 연동정보 입력 후 저장·재조회",
    "같은 PG 또는 계약 유지 시 선택 MID만 변경하고 미입력 연동정보는 기존값 유지",
    "대상 계약 내 MID 중복 거절 및 네 건 원자성",
    "단건 중복 거절과 정상 계약 이동",
    "다른 법인 혼합 선택 차단, 기존 계약 대상 목록 포함 및 창 초기화",
    "배포 후 변경 요약 UI와 미저장 입력 안내",
    "최종 네 건 계약·MID 상태 재조회"
  ],
  "additionalChecklist": [
    {
      "id": "ADD-01",
      "status": "PASS",
      "title": "같은 계약의 수기 MID 값 교환",
      "detailsFile": "artifacts/files/additional-checklist.md",
      "evidenceFile": "artifacts/files/additional-execution.md"
    },
    {
      "id": "ADD-02",
      "status": "PASS",
      "title": "선택하지 않은 MID 값과의 중복 거절",
      "detailsFile": "artifacts/files/additional-checklist.md",
      "evidenceFile": "artifacts/files/additional-execution.md"
    },
    {
      "id": "ADD-03",
      "status": "PASS",
      "title": "여러 선택 MID의 동일 최종값 거절",
      "detailsFile": "artifacts/files/additional-checklist.md",
      "evidenceFile": "artifacts/files/additional-execution.md"
    },
    {
      "id": "ADD-04",
      "status": "PASS",
      "title": "서로 다른 계약의 수기 MID 동일값 허용",
      "detailsFile": "artifacts/files/additional-checklist.md",
      "evidenceFile": "artifacts/files/additional-execution.md"
    },
    {
      "id": "ADD-05",
      "status": "PASS",
      "title": "수기 MID와 다른 계약 단말기 MID의 동일값 허용",
      "detailsFile": "artifacts/files/additional-checklist.md",
      "evidenceFile": "artifacts/files/additional-execution.md",
      "note": "QA 기대값 정정: 수기(KEYIN)를 다른 계약의 단말기(TERMINAL) 값으로 변경하는 것은 현행 계약·유형별 중복 규칙상 허용."
    },
    {
      "id": "ADD-06",
      "status": "PASS",
      "title": "이동 MID와 대상 계약 기존 MID 혼합 선택",
      "detailsFile": "artifacts/files/additional-checklist.md",
      "evidenceFile": "artifacts/files/additional-execution.md"
    },
    {
      "id": "ADD-07",
      "status": "PASS",
      "title": "여러 건 중 필수 연동정보 누락 시 전체 취소",
      "detailsFile": "artifacts/files/additional-checklist.md",
      "evidenceFile": "artifacts/files/additional-execution.md"
    },
    {
      "id": "ADD-08",
      "status": "PASS",
      "title": "계약 유지 상태의 연동정보 수정과 재수정",
      "detailsFile": "artifacts/files/additional-checklist.md",
      "evidenceFile": "artifacts/files/additional-execution.md"
    },
    {
      "id": "ADD-09",
      "status": "PERSONAL_CHECK",
      "title": "연결된 MID 이동과 조건부 정산 검증",
      "detailsFile": "artifacts/files/additional-checklist.md",
      "evidenceFile": "artifacts/files/additional-execution.md",
      "statusText": "개인확인",
      "note": "정산 이관 비활성 부서와 펌뱅킹 정보 누락 대상 계약의 조합을 담당자가 개인확인."
    },
    {
      "id": "ADD-10",
      "status": "PASS",
      "title": "두 브라우저의 동시 동일 MID 저장",
      "detailsFile": "artifacts/files/additional-checklist.md",
      "evidenceFile": "artifacts/files/additional-execution.md",
      "note": "PASS (사용자 변경 기준 적용). 최초 수기 MID 두 건 동시 저장은 200/200 및 중복 2건으로 실제 실패. 수정 배포 후 계약 유지 3회·이동 3회는 모두 200/500, 최종 동일값 1건, 실패 건 원본 상태 유지. 500 Unknown 문구는 관측 사실로 보존하며 이 항목의 실패 조건에서 제외. 409 후속 수정은 사용자 요청으로 undo되어 배포하지 않음."
    },
    {
      "id": "ADD-11",
      "status": "PASS",
      "title": "MID·PG 계약 관리 양쪽 재조회 일치",
      "detailsFile": "artifacts/files/additional-checklist.md",
      "evidenceFile": "artifacts/files/additional-execution.md"
    },
    {
      "id": "ADD-12",
      "status": "PASS",
      "title": "MID가 많은 기존 계약의 소수 건 저장 시간",
      "detailsFile": "artifacts/files/additional-checklist.md",
      "evidenceFile": "artifacts/files/additional-execution.md"
    }
  ],
  "roles": [
    "ADMIN"
  ],
  "routeCandidates": "../../../../qa-results/issues/4220/dev/route-candidates.json",
  "setupSteps": [],
  "pages": [
    {
      "name": "PG MID 관리",
      "application": "admin",
      "path": "/business/pg-mid-manage",
      "tenantParam": "tenantId",
      "roles": [
        "ADMIN"
      ],
      "searchButtonSelector": "button:has-text(\"검색\")",
      "filters": [
        {
          "name": "MID",
          "selector": "input[placeholder*=\"MID\"]",
          "type": "textbox",
          "value": "100410059-test",
          "queryParamCandidates": [
            "mid",
            "keyword",
            "search"
          ]
        }
      ]
    }
  ]
}
