# QA Report - Redmine #4291 (dev)

- Generated: 2026-10-14T11:35:00+09:00
- Redmine: https://itsm.bix.bz/issues/4291
- QA Redmine: https://itsm.bix.bz/issues/4301
- Subject: 관리자 수동이체 반환 시 출금처 잔액 복구
- Workflow Status: 작업완료
- Status: PASS
- Checklist Total: 10
- Checklist Passed: 10
- Checklist Blocked: 0
- Checklist Failed: 0
- Checklist Skipped: 0
- Automated Passed: 2
- Result JSON: artifacts/result-summary.json
- Roles: ADMIN
- Route Candidates: not recorded
- GitHub QA Issue: https://github.com/BIGS-CO-LTD/BIX-QA/issues/608
- QA PR: https://github.com/BIGS-CO-LTD/BIX-QA/pull/607

## Scope

개발계 ADMIN, 지정 출금처 3곳에서 각각 1,004원 이체 후 반환. 기존 Saga 실패 흐름과 앱 코드는 변경하지 않음. 동시 반환·입금 후 상태 저장 실패 검증은 운영 영역으로 분류해 이번 QA 범위에서 제외.

## Checklist

1. 지급계좌 이체·반환 후 잔액 1,004원 복구와 입금 이력
2. 법인 일반계좌 이체·반환 후 잔액·가용잔액 1,004원 복구 및 지급계좌 불변
3. 법인 지갑 이체·반환 후 잔액 1,004원 복구와 입금 이력
4. 예금주확인 실제 조회 결과와 출금처별 거래 식별값 기록
5. 반환 후 실패 상태·처리 사유·새로고침 영속성
6. 이미 실패한 거래의 반환 비활성화 및 성공·진행중 거래의 반환 불가
7. ADMIN·비ADMIN 이체 유형별 반환 확인창 문구
8. 확인창 취소·사유 공백·처리 중 중복 클릭 방지·완료 후 모달 닫힘과 목록 갱신
9. COMPLETE_TRANSFER_TRANSACTION 및 RETURN_TRANSFER_TRANSACTION 권한 연결
10. 별도 적합한 거래가 있을 때 완료 버튼의 상태만 변경 동작

## Setup Steps

- 없음

## Source Text

관리자 수동이체 반환 시 지급계좌·법인 일반계좌·법인 지갑 잔액 복구와 ADMIN 안내 문구를 개발계에서 실제 검증한다. 수취인은 화면 예금주확인 후 결과를 사용하며 인증값과 전체 수취계좌번호는 공개 산출물에 기록하지 않는다.

## Execution Summary

- Passed: 2
- Failed: 0
- Skipped: 0
- Blocked: 0
- Flaky: 0
- Duration: 23096ms


## 전체 체크리스트 판정

자동화 영속성 테스트 2건은 모두 통과했습니다. 아래 판정은 실제 이체·반환, 9~10월 이체내역 실측, 제어된 화면 검증을 포함한 전체 10개 항목 기준입니다.

| 번호 | 항목 | 판정 | 실제 결과 |
|---:|---|---|---|
| 1 | 지급계좌 이체·반환 후 잔액 1,004원 복구와 입금 이력 | PASS | 12,500,288원 → 12,499,284원 → 12,500,288원, 반환 입금 1,004원 확인 |
| 2 | 법인 일반계좌 이체·반환 후 잔액·가용잔액 1,004원 복구 및 지급계좌 불변 | PASS | 잔액 5,798,106원 → 5,797,102원 → 5,798,106원, 가용잔액 복구 및 지급계좌 잔액 불변 확인 |
| 3 | 법인 지갑 이체·반환 후 잔액 1,004원 복구와 입금 이력 | PASS | 297,203원 → 296,199원 → 297,203원, 반환 입금 1,004원 확인 |
| 4 | 예금주확인 실제 조회 결과와 출금처별 거래 식별값 기록 | PASS | 실제 예금주 조회 후 동일 수취인으로 이체했고 세 거래의 식별값을 실행 기록에 보관 |
| 5 | 반환 후 실패 상태·처리 사유·새로고침 영속성 | PASS | 세 거래 모두 실패 상태와 입력 사유가 새로고침 후 유지됐고 반환 버튼이 비활성화됨 |
| 6 | 이미 실패한 거래의 반환 비활성화 및 성공·진행중 거래의 반환 불가 | PASS | 실패 거래 반환 버튼 비활성화, 실제 성공 거래 작업 버튼 0개. 진행중은 서버 응답을 대체한 화면 검증에서 작업 버튼 0개 |
| 7 | ADMIN·비ADMIN 이체 유형별 반환 확인창 문구 | PASS | 실제 ADMIN과 AUTO 대기 거래에서 각각 원래 출금처 반환·지갑 반환 문구 확인. 분기 기준은 사용자 역할이 아닌 이체 유형 |
| 8 | 확인창 취소·사유 공백·처리 중 중복 클릭 방지·완료 후 모달 닫힘과 목록 갱신 | PASS | 실제 취소·공백 차단·모달 닫힘·목록 갱신 확인. POST 지연·차단 화면 검증에서 처리 중 버튼 비활성화와 요청 1회 확인 |
| 9 | COMPLETE_TRANSFER_TRANSACTION 및 RETURN_TRANSFER_TRANSACTION 권한 연결 | PASS | ADMIN 권한 응답에서 두 권한이 확인되고 화면에 완료·반환 버튼이 표시됨 |
| 10 | 별도 적합한 거래가 있을 때 완료 버튼의 상태만 변경 동작 | PASS | 0원 ADMIN 개발계 테스트 거래: HTTP 200, 정산 완료 옵션 false, PENDING→COMPLETED, 사유·금액 유지 확인 |

## 검증 방법과 범위

- 2026-09-01~2026-10-14 실제 이체내역 60건을 조회했다. 최초 상태는 실패 8, 대기 23, 성공 13, 결과확인대기 16건이었다.
- 성공 거래의 작업 버튼 부재와 AUTO 대기 거래의 지갑 반환 문구는 실제 화면에서 확인했다.
- 진행중 작업 버튼 부재와 처리 중 중복 클릭 방지는 브라우저 응답·요청을 제어한 화면 검증이다. 해당 검증은 서버 상태를 변경하지 않았다.
- 완료 처리 검증은 별도 0원 개발계 ADMIN 거래 1건에 한정한다. 금액 있는 거래의 잔액 불변성은 이 사례로 검증하지 않았다.

## 증거 자료

- 반환 전후 잔액·입금 내역·화면 캡처와 원본 실행 기록은 아래 **실제 이체·반환 결과**에 연결했습니다.

## 자동화 원본 결과

| Scenario | Status | Duration | Screenshot | 화면 재현 기록 | Log | Error |
|---|---:|---:|---|---|---|---|
| 4291/dev/return-persistence.spec.ts / [4291] 세 출금처의 반환 입금 이력이 유지된다 | PASS | 13546ms |  |  |  |  |
| 4291/dev/return-persistence.spec.ts / [4291] 반환한 거래는 실패 상태이며 반환 버튼이 비활성화된다 | PASS | 8845ms |  |  |  |  |

## Notes

- Playwright 실행 결과를 기준으로 작성되었습니다.
- QA PR 병합과 공개 보고서 확인 후 Redmine QA #4301을 작업완료로 갱신했습니다. 보고서 첨부 업로드는 HTTP 400으로 실패해 공개 보고서 링크를 남겼습니다.

## 실제 이체·반환 결과

Playwright의 위 2건은 반환 후 영속성 검증이다. 이체 생성·예금주확인·반환은 별도 TypeScript/Playwright 스크립트로 개발계 화면에서 실행했다. 상세 단계와 응답은 [실행 기록](artifacts/logs/execution.md)에 있다.

| 출금처 | 이체 전 | 출금 후 | 반환 후 | 결과 |
|---|---:|---:|---:|---|
| 테스트 지급계좌 | 12,500,288원 | 12,499,284원 | 12,500,288원 | PASS — [잔액](artifacts/screenshots/disbursement-after-return.png), [입금 내역](artifacts/screenshots/verify-disbursement-history.png) |
| 박재민 법인계좌 / 일반 | 잔액 5,798,106원 / 가용 5,137,664원 | 잔액 5,797,102원 / 가용 5,136,660원 | 잔액 5,798,106원 / 가용 5,137,664원 | PASS — [잔액](artifacts/screenshots/corporation-after-return.png), [입금 내역](artifacts/screenshots/verify-corporation-history.png) |
| 박재민_법인 지갑 | 297,203원 | 296,199원 | 297,203원 | PASS — [잔액](artifacts/screenshots/verify-wallet.png), [입금 내역](artifacts/screenshots/verify-wallet-history.png) |

세 거래 모두 반환 API HTTP 200, 이체내역 실패 상태 및 입력 사유 유지, 별도 잔고 조정 없이 1,004원 복구를 확인했다. 법인계좌 반환 전후 지급계좌 잔액은 12,500,288원으로 유지됐다.

위 잔액은 10월 14일 반환 직후의 측정값이다. 후속 회귀 시 공유 개발계 지급계좌의 현재 잔액은 12,501,292원으로 달랐다. 후속 테스트는 현재 잔액의 고정값 비교 대신 반환 입금 이력과 거래 상태를 확인한다.

## 추가 화면 확인

| 항목 | 판정 | 근거 |
|---|---|---|
| ADMIN 반환 안내 문구 | PASS | [확인창](artifacts/screenshots/disbursement-return-confirm.png)에 “이체를 실패 처리하고, 출금된 금액을 원래 출금처로 반환합니다.” 표시 |
| AUTO 반환 안내 문구 | PASS | 9~10월 실제 AUTO 대기 거래의 확인창에 지갑 반환 문구 표시, 확인창 취소 |
| 사유 공백 차단·확인 취소 | PASS | 반환 버튼 비활성화, 취소 후 대기 상태 유지 — [화면](artifacts/screenshots/modal-confirm-cancel.png) |
| 반환 완료 후 모달 닫힘·목록 갱신·실패 거래 반환 비활성화 | PASS | 반환 스크립트와 새로고침 Playwright 테스트 2건 통과 |
| ADMIN의 완료·반환 권한 연결 | PASS | 실제 권한 응답에 두 권한이 있고 화면에 두 버튼이 표시됨 |
| 성공 거래의 작업 버튼 부재 | PASS | 9~10월 실제 성공 거래에서 작업 버튼 0개 확인 |
| 진행중 거래의 작업 버튼 부재 | PASS (화면 검증) | 서버 응답을 일시 대체한 진행중 행에서 작업 버튼 0개, 서버 변경 없음 |
| 처리 중 중복 클릭 방지 | PASS (화면 검증) | 브라우저에서 POST를 지연·차단해 버튼 비활성화와 요청 1회 확인 |
| 상태만 완료 처리 | PASS | 0원 개발계 테스트 거래의 상태·사유 변경, `completeSettlements=false`, 금액 유지 확인 |
| 지갑 1건 이체 | PASS | 화면의 `지갑 복수이체`에서 1행 양식으로 1건 실행 |

비밀값이 담길 수 있는 원본 trace는 로컬 비공개 결과 폴더에 보관했고 이 보고서에는 넣지 않았다.
