# #4291 개발계 실제 실행 기록

- 실행일: 2026-10-14, KST
- 환경: `https://admin-dev.biscuitpay.com`, 빅스페이먼츠 테넌트, ADMIN
- 요청자: 김경주
- 수취은행: 기업은행(003), 계좌 끝자리 `5730`
- 예금주확인: 단건이체 화면에서 실제 조회 성공 및 예금주를 확인했다. 공개본에는 `김*주`로 마스킹한다. 지급계좌·법인계좌 각각 조회했고, 지갑 1행 양식에는 확인한 동일 계좌와 예금주를 입력했다.
- 각 이체: 1,004원, 가맹점명 `박재민_한결데`, 입금계좌적요 `입금테스트`
- 인증값과 전체 수취계좌번호는 이 파일에 기록하지 않았다. 원본 Playwright trace 및 요청 응답은 무시된 `qa-results/issues/4291/dev/`에만 있다.

## 출금처별 결과

| 출금처 | 거래 ID / 이체시각 | 이체 전 | 출금 후 | 반환 후·새로고침 | 반환 입금 내역 | 판정 |
|---|---|---:|---:|---:|---|---|
| 테스트 지급계좌 | `11f1-c76e-3bb0d2af-a42d-000000000001` / 10:26:08 | 12,500,288원 | 12,499,284원 | 12,500,288원 | 10:26:59, `지급계좌 관리자 이체 반환`, 입금 1,004원 | PASS |
| 박재민 법인계좌 / 일반 | `11f1-c76e-661ef1d0-a42d-000000000001` / 10:27:19 | 잔액 5,798,106원; 가용잔액 5,137,664원 | 잔액 5,797,102원; 가용잔액 5,136,660원 | 잔액 5,798,106원; 가용잔액 5,137,664원 | 10:27:45, `법인계좌 관리자 이체 반환`, 입금 1,004원 | PASS |
| 박재민_법인 지갑 | `11f1-c76e-c6eb5ee1-a42d-000000000001` / 10:30:02 | 297,203원 | 296,199원 | 297,203원 | 10:30:33, `외부 입금`, 입금 1,004원; 화면 상태 `실패` | PASS |

세 거래의 반환 API는 각각 `POST /api/v1/transfer/transactions/{id}/return` HTTP 200, 응답 `result.code=200`이었다. 반환 후 이체내역은 모두 `실패`와 입력 사유(`#4291 QA 지급계좌 반환 확인`, `#4291 QA 법인계좌 반환 확인`, `#4291 QA 법인 지갑 반환 확인`)로 갱신됐다. 완료 시 작업 모달이 닫혔고 목록이 갱신됐다. 새로고침 뒤에도 잔액과 상태가 유지됐다. 별도 잔고 조정은 수행하지 않았다.

법인계좌 반환 전후 지급계좌 `테스트 지급계좌`는 12,500,288원으로 유지됐다. 지갑 반환 뒤에도 해당 지급계좌는 동일했다.

지갑관리의 이체 메뉴에는 `관리자 이체 > 단건이체`가 없고 `지갑 복수이체`가 있다. 화면에서 내려받은 1행 양식에 지정된 수취인·금액을 넣고 1건만 실행했다. 이체 API 응답의 거래 ID와 화면 출금·반환 내역을 대조했다.

## 화면·권한 확인

- ADMIN의 반환 확인창은 `이체를 실패 처리하고, 출금된 금액을 원래 출금처로 반환합니다.`로 표시됐다.
- 사유 공백 시 반환 버튼 비활성화, 사유 입력 시 활성화. 확인창 `취소` 후 대기 상태와 금액은 그대로였고 작업 모달이 유지됐다.
- 반환 완료 후 세 실패 거래에서 반환 버튼이 비활성화됐다.
- 제공된 ADMIN의 `/api/v1/users/permissions` 응답에 `COMPLETE_TRANSFER_TRANSACTION`, `RETURN_TRANSFER_TRANSACTION`이 모두 있었고 이체내역 작업 창에 완료·반환 버튼이 표시됐다.
- 9월 1일~10월 14일 이체내역을 조회했다. 최초 60건은 실패 8, 대기 23, 성공 13, 결과확인대기 16건이었다. 이 기간에는 진행중·결과확인중 상태가 없었다.
- 실제 성공 거래는 화면의 작업 버튼이 표시되지 않았다. 진행중 상태는 응답을 임시로 바꾼 화면 검증에서 작업 버튼 0개를 확인했다. 이 화면 검증은 서버 데이터를 변경하지 않았다.
- 실제 AUTO 대기 거래에서 반환 확인창의 `상태 실패 및 지갑으로 해당 금액이 반환됩니다.` 문구를 확인하고 취소했다. 이 문구 분기는 사용자 역할이 아니라 거래의 이체 유형(ADMIN/AUTO/STORE) 기준이다.
- 반환 응답을 브라우저에서 지연시키고 POST를 서버로 보내지 않는 화면 검증에서 `처리중...` 버튼 비활성화와 1회 요청만 확인했다. 실제 은행 또는 서버 중복 요청 검증은 포함하지 않는다.
- 0원 ADMIN 대기 거래 `11f1-c16e-7bb79caa-887f-000000000001`(개발자 사용 계좌)을 완료 처리했다. 사전 상태·유형·금액·계좌명을 다시 확인하고 `completeSettlements=false`로 요청했다. HTTP 200/result.code 200, `PENDING → COMPLETED`, 입력 사유 유지, 금액 0원 유지를 재조회로 확인했다. 실제 입출금이 있는 거래의 잔액 불변성은 이 0원 사례만으로 판정하지 않는다.
- 후속 회귀 실행 당시 공유 개발계의 `테스트 지급계좌` 현재 잔액은 12,501,292원으로 최초 반환 직후의 12,500,288원과 달랐다. 해당 차이의 거래 원인은 이번 검증에서 단정하지 않는다. 과거 반환 입금 이력과 거래 상태를 확인하는 회귀 테스트에서 현재 잔액의 고정값 비교를 제거했다.
- TA 계정은 신선한 로그인에 성공했으나 해당 범위에서 작업 가능한 행이 없었고, CO는 로그인 시간 초과, BO는 기기 승인/SMS가 필요했다. 권한 분리 부여 자체는 이번 체크리스트 범위에 포함되지 않는다.
- 동시 반환 중복입금 및 입금 확정 뒤 상태 저장 실패 위험은 운영 영역으로 분류해 이번 개발계 QA 범위에서 제외했다.

## 실행 명령

로그인 정보와 전체 수취계좌번호는 `.env.local` 및 실행 환경변수에만 주입했다. 원문 값은 명령 기록에서 제외한다.

```bash
npx tsx scripts/issue-4291-qa.ts
npx tsx scripts/issue-4291-single-probe.ts disbursement
npx tsx scripts/issue-4291-execute-single.ts disbursement
npx tsx scripts/issue-4291-return.ts disbursement <거래 ID> <이체시각>
npx tsx scripts/issue-4291-execute-single.ts corporation
npx tsx scripts/issue-4291-return.ts corporation <거래 ID> <이체시각>
npx tsx scripts/issue-4291-wallet-template.ts
npx tsx scripts/issue-4291-wallet.ts
npx tsx scripts/issue-4291-return.ts wallet <거래 ID> <이체시각>
npx tsx scripts/issue-4291-verify.ts
QA_ISSUE=4291 QA_STAGE=dev npx playwright test qa/issues/4291/dev/return-persistence.spec.ts
npx tsc --noEmit
```

Playwright 회귀 테스트 2건 통과, TypeScript 검사 통과. 원본 trace 6개는 `qa-results/issues/4291/dev/*-trace.zip`에 남겼고 공개 산출물에는 포함하지 않았다.
