{
  "issueId": "4042",
  "environment": "dev",
  "source": "Redmine #4042 및 사용자 제공 DEV QA 범위 (인증정보 제외)",
  "sourceText": "#4042 DEV QA 요청 (인증정보 제외)\n\n- 검증 소스: 백엔드 feat/issue-4042 6cf2413d7c, 전산 feat/#4042 aee769ed3, 스토어 feat/#4042 8f6149e1.\n- 실제 이체·출금·완료·반환 확정은 실행하지 않는다. 조회, 버튼 상태, 안내, 작업창 열기까지만 확인한다.\n- DEV 은행 점검시간은 테스트용 16:20~23:00(KST)로 사전 검증 후, 22:42경 요청자가 종료 시각을 22:00으로 변경했다. 설정을 변경하지 않는다.\n- 전산 ADMIN의 계좌관리 > 이체하기 화면에서 `머천트 이체`와 `이체하기` 버튼의 점검시간 차단을 확인한다. 전산 이체내역의 `작업` 열은 완료·반환 검증에 사용한다.\n- 전산 송금관리, 렌탈페이, 관리자 펌뱅킹, 계좌 펌뱅킹의 이체 버튼 차단·안내와 조회 유지 여부를 확인한다.\n- 스토어 VE 홈·지갑내역의 송금 버튼 차단, 모바일 안내 배치, 조회·잔액 새로고침을 확인한다.\n- 종료 시각 변경 후 새로 연 화면, 재진입 화면, 변경 전부터 열려 있던 화면을 새로고침한 뒤 상태를 각각 확인한다.\n- TA 운영사 이체내역은 최근 한 달(2026-09-13~2026-10-13)로 조회한다. 완료·반환은 동일 운영사/펌뱅크 유형/상태 및 권한 조합을 확인하고, 본인 운영사의 지정 법인 밖 건도 확인한다. 박재민_법인 지정 후 재검증에서도 대상 거래가 없어, 요청자 지시에 따라 완료·반환 작업 대상과 지정 법인 밖 작업 허용 2건은 SKIPPED로 기록한다. 확인된 PASS로 간주하지 않는다.\n- ADMIN이 TA 프리셋의 완료·반환 권한을 제거/완료만/반환만/모두/제거로 변경하며 TA 반영을 확인한다. 원래 값으로 복구한다.\n- 계정별 브라우저 세션은 분리한다. 비밀번호와 2FA는 로그인에만 사용하며 저장소·증거·보고서에는 기록하지 않는다.\n- 외부 메시지와 임의 push·배포는 하지 않는다.\n\n- 2026-10-13 후속 요청: 자동 QA 미실행 2건을 요청자 김경주의 개인확인완료로 정정한다. 자동 테스트 통과와 구분한다.\n",
  "scope": "DEV 점검 차단 사전 검증(당시 16:20~23:00), 종료 시각 22:00 변경 후 새로 연 화면과 이미 열린 화면을 새로고침한 뒤 버튼 상태, 최근 한 달 TA 완료·반환 권한/법인 범위. 실제 금융 확정 호출 제외.",
  "checklist": [
    "전산 ADMIN 계좌관리 > 이체하기의 머천트 이체·이체하기 버튼이 점검시간에 비활성화되고 점검 안내를 표시하며 조회는 유지된다.",
    "전산 ADMIN 렌탈페이 이체하기, 관리자 펌뱅킹, 계좌 펌뱅킹의 이체 동작이 점검시간에 차단되고 안내·조회는 유지된다.",
    "스토어 VE 홈·지갑내역 송금 버튼이 점검시간에 비활성화되고 모바일 안내 배치, 조회·잔액 새로고침이 정상이다.",
    "22:00 종료 설정 후 새로 연 화면과 재진입 화면의 이체·송금 버튼 활성화를 확인한다. 설정 변경 전부터 열린 이체 화면은 새로고침한 뒤 활성화되는지 확인한다.",
    "TA 이체내역에서 동일 운영사·펌뱅크 유형·허용 상태의 완료·반환 작업과 본인 운영사 지정 법인 밖 건의 작업 허용을 확인한다.",
    "ADMIN이 TA 프리셋 완료·반환 권한을 제거/완료만/반환만/모두/제거 순으로 변경할 때 TA 재로그인 후 작업 노출이 반영되고 원래 권한이 복구된다."
  ],
  "roles": [
    "ADMIN",
    "TA",
    "VE"
  ],
  "routeCandidates": "../../../../qa-results/issues/4042/dev/route-candidates.json",
  "setupSteps": [
    {
      "name": "DEV 점검 종료 시각 변경 확인",
      "kind": "state-verify",
      "role": "ADMIN",
      "application": "admin",
      "description": "사전 차단 검증 당시 16:20~23:00이었고, 요청자가 22:42경 16:20~22:00으로 변경했다. GET /api/v1/transfer/maintenance-window와 종료 후 화면 활성화를 확인한다.",
      "required": true,
      "mutation": "none",
      "navigation": {
        "name": "계좌관리 > 이체하기",
        "path": "/account/remittance-manage"
      }
    },
    {
      "name": "TA 완료·반환 프리셋 권한 조합 및 원복",
      "kind": "permission-toggle",
      "role": "ADMIN",
      "application": "admin",
      "targetRoles": [
        "TA"
      ],
      "description": "TA 사용자에 연결된 프리셋의 COMPLETE_TRANSFER_TRANSACTION/RETURN_TRANSFER_TRANSACTION 권한을 제거, 완료만, 반환만, 모두, 제거 순서로 시험한다. 연결 사용자 범위를 먼저 확인하고 원래 값을 복구한다.",
      "spec": "00-admin-transfer-action-permission.spec.ts",
      "required": true,
      "mutation": "temporary",
      "guardEnv": "QA_ALLOW_PERMISSION_MUTATION",
      "navigation": {
        "name": "관리자 > 사용자 프리셋 관리",
        "path": "/admin/member-preset"
      },
      "target": {
        "type": "role-preset",
        "role": "TA",
        "userEnvKey": "BIX_ADMIN_DEV_TA_USERNAME",
        "avoidSharedPreset": true
      },
      "actions": [
        {
          "name": "완료 권한",
          "intent": "toggle-permission",
          "label": "COMPLETE_TRANSFER_TRANSACTION"
        },
        {
          "name": "반환 권한",
          "intent": "toggle-permission",
          "label": "RETURN_TRANSFER_TRANSACTION"
        },
        {
          "name": "대상 역할 재로그인",
          "intent": "refresh-auth",
          "label": "TA"
        }
      ],
      "restore": {
        "required": true,
        "description": "기존 프리셋 연결과 두 권한의 원래 값으로 복구하고 화면에서 재확인한다."
      },
      "evidence": [
        {
          "name": "변경 전·조합별·원복 후 권한 상태",
          "screenshot": "permission-toggle.png"
        }
      ]
    }
  ],
  "pages": [
    {
      "name": "계좌관리 > 이체하기",
      "application": "admin",
      "roles": [
        "ADMIN"
      ],
      "path": "/account/remittance-manage",
      "tenantParam": "tenantId",
      "searchButtonSelector": "button:has-text('검색')"
    },
    {
      "name": "계좌관리 > 이체하기(렌탈페이)",
      "application": "admin",
      "roles": [
        "ADMIN"
      ],
      "path": "/account/remittance-manage-rentalpay",
      "tenantParam": "tenantId",
      "searchButtonSelector": "button:has-text('검색')"
    },
    {
      "name": "계좌관리 > 펌뱅킹 등록",
      "application": "admin",
      "roles": [
        "ADMIN"
      ],
      "path": "/account/account-inquiry",
      "tenantParam": "tenantId",
      "searchButtonSelector": "button:has-text('검색')"
    },
    {
      "name": "관리자 > 펌뱅킹",
      "application": "admin",
      "roles": [
        "ADMIN"
      ],
      "path": "/admin/firmbank-v2",
      "tenantParam": "tenantId",
      "searchButtonSelector": "button:has-text('검색')"
    },
    {
      "name": "스토어 홈",
      "application": "store",
      "roles": [
        "VE"
      ],
      "path": "/",
      "tenantParam": "tenantId"
    },
    {
      "name": "스토어 지갑내역",
      "application": "store",
      "roles": [
        "VE"
      ],
      "path": "/wallets",
      "tenantParam": "tenantId"
    },
    {
      "name": "전산 이체내역",
      "application": "admin",
      "roles": [
        "TA"
      ],
      "path": "/account/transfer-details",
      "tenantParam": "tenantId",
      "searchButtonSelector": "button:has-text('검색')"
    },
    {
      "name": "관리자 > 사용자 프리셋 관리",
      "application": "admin",
      "roles": [
        "ADMIN"
      ],
      "path": "/admin/member-preset",
      "tenantParam": "tenantId"
    }
  ],
  "scenario": "bank-maintenance-transfer-block"
}
