# QA Report - Redmine #3143 (dev)

- Generated: 2026-05-26T16:02:58+09:00
- Redmine: https://itsm.bix.bz/issues/3143
- QA Redmine: https://itsm.bix.bz/issues/3376
- Subject: [QA] 페이레터 KoVan 단말기 승인/취소 통보 화면 반영 검증
- Workflow Status: 진행 중
- Status: FAIL
- Result JSON: artifacts/result-summary.json
- Roles: ADMIN
- Route Candidates: not recorded

## Scope

dev ADMIN 계정으로 페이레터 KoVan 단말기 승인/취소 통보를 새 cid/tid/거래일시 세트로 발송한 뒤 어드민 거래내역 화면의 승인/취소 상태, 금액, 거래일시, 카드 정보 유지 여부를 검증

## Checklist

1. 승인 통보 전송 후 거래 내역 화면에서 승인 거래가 조회되는지 확인
2. 승인 거래 금액이 1,004원으로 표시되는지 확인
3. 승인 거래 일시가 2026-05-26 15:35:00 기준으로 표시되는지 확인
4. 카드 정보가 테스트카드 / 244112******9428 기준으로 확인되는지 확인
5. 취소 통보 전송 후 동일 거래가 취소 상태로 반영되는지 확인
6. 취소 거래 금액이 1,004원으로 표시되는지 확인
7. 취소 거래 일시가 2026-05-26 15:36:00 기준으로 표시되는지 확인
8. 화면 새로고침 후에도 승인/취소 상태가 유지되는지 확인

## Setup Steps

1. [required] 페이레터 KoVan 승인/취소 통보 실행 허용 (admin/ADMIN / kind: data-create / mutation: temporary / guard: QA_3143_ALLOW_NOTIFICATION_MUTATION / restore: required) - QA_3143_ALLOW_NOTIFICATION_MUTATION=1일 때만 개발계 페이레터 단말기 승인/취소 통보 POST를 실제 발송한다. 동일 tid=000001, cid=000002 기준으로 승인 1회, 취소 1회를 순서대로 발송하며 이전 테스트의 tid/cid/transaction_date는 재사용하지 않는다.

## Source Text

주홍석님의 QA 요청입니다
조지민 프로님 안녕하세요, 비스킷 링크 개발계 QA 요청드립니다
[1] QA 요청 배경
- https://itsm.bix.bz/issues/3143
- 페이레터 KoVan 단말기 승인/취소 통보가 개발계 화면에 정상 반영되는지 확인 요청드립니다.
[2] 사전 데이터
- 페이레터 단말기 MID: payletter1234
- 이번 QA 테스트 세트: cid=000002, tid=000001, 승인 거래일시=2026-05-26 15:35:00, 취소 거래일시=2026-05-26 15:36:00
- 승인/취소 금액: 1,004원, 주문번호: 000000997981
[3] 사전 작업
- admin 계정으로 개발계 어드민 접속
- 결제/거래 내역을 확인할 수 있는 메뉴 접근 가능 여부 확인
- 아래 후속 메시지의 curl로 승인 통보와 취소 통보를 각각 전송 후 화면 확인
[4] 권한별 테스트
- admin
[5] 검증 대상
- 어드민 결제/거래 내역 화면
- 결제 승인 상태 및 취소 상태 표시
- 거래 금액, 거래 일시, 카드 정보 표시
[6] 체크리스트
- 승인 통보 전송 후 거래 내역 화면에서 승인 거래가 조회되는지 확인
- 승인 거래 금액이 1,004원으로 표시되는지 확인
- 승인 거래 일시가 2026-05-26 15:35:00 기준으로 표시되는지 확인
- 카드 정보가 테스트카드 / 244112******9428 기준으로 확인되는지 확인
- 취소 통보 전송 후 동일 거래가 취소 상태로 반영되는지 확인
- 취소 거래 금액이 1,004원으로 표시되는지 확인
- 취소 거래 일시가 2026-05-26 15:36:00 기준으로 표시되는지 확인
- 화면 새로고침 후에도 승인/취소 상태가 유지되는지 확인
- 주의: 승인/취소 한 세트에서는 같은 tid를 사용하고, 이전 테스트의 tid/cid/transaction_date는 재사용하지 말아주세요

[페이레터 KoVan 단말기 통보 테스트 curl]

주의:
승인/취소 한 세트에서는 같은 tid를 사용해주세요.
이전 테스트의 tid/cid/transaction_date는 재사용하지 말아주세요.

승인 통보:
curl -X POST 'https://api-dev.biscuitpay.com/api/v1/payment/notification/terminal/payletter-noti' \
  -H 'Content-Type: application/json' \
  -H 'X-Forwarded-Host: api.biscuitpay.com' \
  -H 'X-Forwarded-Proto: https' \
  -d '{"amount":1004,"business_number":"2138140742","buy_company_code":"15","card_info":"테스트카드","cat_id":"payletter1234","check_card":"0","cid":"000002","client_business_number":"7318701628","enc_card_no":"244112******9428","installment":"00","issue_company_code":"15","order_no":"000000997981","pay_type":"offline","pltid":"tsjtest1-202605149351347","pos_entry_mode":"S","service_amount":0,"store_number":"139634181","tax_amount":364,"tid":"000001","transaction_date":"20260526153500","use_state":"0","user_name":"1047263358"}'

취소 통보:
curl -X POST 'https://api-dev.biscuitpay.com/api/v1/payment/notification/terminal/payletter-noti' \
  -H 'Content-Type: application/json' \
  -H 'X-Forwarded-Host: api.biscuitpay.com' \
  -H 'X-Forwarded-Proto: https' \
  -d '{"amount":1004,"business_number":"2138140742","buy_company_code":"15","card_info":"테스트카드","cat_id":"payletter1234","check_card":"0","cid":"000002","client_business_number":"7318701628","enc_card_no":"244112******9428","installment":"00","issue_company_code":"15","order_no":"000000997981","pay_type":"offline","pltid":"tsjtest1-202605149351347","pos_entry_mode":"S","service_amount":0,"store_number":"139634181","tax_amount":364,"tid":"000001","transaction_date":"20260526153600","use_state":"1","user_name":"1047263358"}'

## Execution Summary

- Passed: 7
- Failed: 1
- Skipped: 0
- Blocked: 0
- Flaky: 0
- Duration: 44885ms

## QA 판단

- 최종 결과: 실패
- 재 QA 대상: 승인 통보 전송 직후 거래내역에서 대상 거래가 `승인` 상태로 조회되는지 다시 확인이 필요합니다.
- 확인된 내용: 동일 세트(`cid=000002`, `tid=000001`)의 금액, 거래일시, 카드 정보, 취소 상태, 새로고침 후 취소 상태 유지는 화면에서 확인되었습니다.
- 실패 사유: 승인 거래 확인 단계에서 대상 거래가 `승인`이 아니라 `취소` 상태로 조회되었습니다. 이번 세트는 이미 발송된 데이터라 동일 `tid/cid/transaction_date`를 재사용하지 않고, 새 세트로 재검증해야 합니다.

## 한눈에 보는 결과

| 확인한 항목 | 계정 | 화면 | 수행한 동작 | 결과 | 증거 자료 |
|---|---|---|---|---|---|
| 승인 통보 전송 후 거래 내역 화면에서 승인 거래가 조회되는지 확인 | ADMIN | [ADMIN] role | ADMIN 계정으로 [ADMIN] role 항목을 확인 | 기대한 동작과 달랐습니다: Error: 거래 상태가 승인/결제완료 계열이어야 합니다. 실제=CANCEL / 12026-05-26 15:36:002026-05-26 11:51:13페이레터A_주홍석_법인_페이레터A_주홍석_법인A_주홍석_가맹5_페이레터BP10051610.0001,004-100-903일반정산매 5분지갑정산내역비신고취소000002일시불테스트카드244112******9428-결제통보-인증2026-05-26 15:35:00----0--취소내역000001원거래 아님BP100516A_주홍석_가맹5_페이레터paylettersecret-redacted000000997981 / CANCEL  expect(received).toBe(expected) // Object.is equality | [스크린샷 1](artifacts/screenshots/01-거래내역-ADMIN-approval-visible.png)<br>[스크린샷 2](artifacts/screenshots/02-screenshot.png)<br>[화면 재현 기록 1](https://pub-2726d2ecd69d4e12a4515edca8540068.r2.dev/qa/issues/3143/dev/artifacts/traces/01-trace.zip?v=3515b7d4c5c9c04d85a8985d8d1b50b90bf0e7a8)<br>[실행 기록 1](artifacts/logs/01-거래내역-ADMIN-approval-notification-response.md)<br>[실행 기록 2](artifacts/logs/02-거래내역-ADMIN-approval-status.md)<br>[실행 기록 3](artifacts/logs/03-error-context.md) |
| 승인 거래 금액이 1,004원으로 표시되는지 확인 | ADMIN | [ADMIN] role | ADMIN 계정으로 [ADMIN] role 항목을 확인 | 기대한 동작과 일치했습니다. | [스크린샷 1](artifacts/screenshots/03-거래내역-ADMIN-approval-visible.png)<br>[실행 기록 1](artifacts/logs/04-거래내역-ADMIN-approval-amount.md) |
| 승인 거래 일시가 2026-05-26 15:35:00 기준으로 표시되는지 확인 | ADMIN | [ADMIN] role | ADMIN 계정으로 [ADMIN] role 항목을 확인 | 기대한 동작과 일치했습니다. | [실행 기록 1](artifacts/logs/05-거래내역-ADMIN-approval-date.md) |
| 244112******9428 기준으로 확인되는지 확인 | ADMIN | 카드 정보가 테스트카드 | ADMIN 계정으로 카드 정보가 테스트카드 항목을 확인 | 기대한 동작과 일치했습니다. | [실행 기록 1](artifacts/logs/06-거래내역-ADMIN-approval-card-info.md) |
| 취소 통보 전송 후 동일 거래가 취소 상태로 반영되는지 확인 | ADMIN | [ADMIN] role | ADMIN 계정으로 [ADMIN] role 항목을 확인 | 기대한 동작과 일치했습니다. | [스크린샷 1](artifacts/screenshots/04-거래내역-ADMIN-cancel-visible.png)<br>[실행 기록 1](artifacts/logs/07-거래내역-ADMIN-cancel-notification-response.md)<br>[실행 기록 2](artifacts/logs/08-거래내역-ADMIN-cancel-status.md) |
| 취소 거래 금액이 1,004원으로 표시되는지 확인 | ADMIN | [ADMIN] role | ADMIN 계정으로 [ADMIN] role 항목을 확인 | 기대한 동작과 일치했습니다. | [실행 기록 1](artifacts/logs/09-거래내역-ADMIN-cancel-amount.md) |
| 취소 거래 일시가 2026-05-26 15:36:00 기준으로 표시되는지 확인 | ADMIN | [ADMIN] role | ADMIN 계정으로 [ADMIN] role 항목을 확인 | 기대한 동작과 일치했습니다. | [실행 기록 1](artifacts/logs/10-거래내역-ADMIN-cancel-date.md) |
| 화면 새로고침 후에도 승인/취소 상태가 유지되는지 확인 | ADMIN | [ADMIN] role | ADMIN 계정으로 [ADMIN] role 항목을 확인 | 기대한 동작과 일치했습니다. | [스크린샷 1](artifacts/screenshots/05-거래내역-ADMIN-refresh-persisted.png)<br>[실행 기록 1](artifacts/logs/11-거래내역-ADMIN-refresh-persisted.md) |

## 실패 또는 확인 불가 상세

### 1. ADMIN / [ADMIN] role / 실패

- 체크 항목: 승인 통보 전송 후 거래 내역 화면에서 승인 거래가 조회되는지 확인
- 수행한 동작: ADMIN 계정으로 [ADMIN] role 항목을 확인
- 기대 결과: ADMIN 계정에서 [ADMIN] role 확인 결과가 체크리스트와 일치해야 합니다.
- 실제 결과: 기대한 동작과 달랐습니다: Error: 거래 상태가 승인/결제완료 계열이어야 합니다. 실제=CANCEL / 12026-05-26 15:36:002026-05-26 11:51:13페이레터A_주홍석_법인_페이레터A_주홍석_법인A_주홍석_가맹5_페이레터BP10051610.0001,004-100-903일반정산매 5분지갑정산내역비신고취소000002일시불테스트카드244112******9428-결제통보-인증2026-05-26 15:35:00----0--취소내역000001원거래 아님BP100516A_주홍석_가맹5_페이레터paylettersecret-redacted000000997981 / CANCEL  expect(received).toBe(expected) // Object.is equality
- 분류: 기대 결과와 다름
- 오류 내용: Error: 거래 상태가 승인/결제완료 계열이어야 합니다. 실제=CANCEL / 12026-05-26 15:36:002026-05-26 11:51:13페이레터A_주홍석_법인_페이레터A_주홍석_법인A_주홍석_가맹5_페이레터BP10051610.0001,004-100-903일반정산매 5분지갑정산내역비신고취소000002일시불테스트카드244112******9428-결제통보-인증2026-05-26 15:35:00----0--취소내역000001원거래 아님BP100516A_주홍석_가맹5_페이레터paylettersecret-redacted000000997981 / CANCEL  expect(received).toBe(expected) // Object.is equality
- 스크린샷: [스크린샷 1](artifacts/screenshots/01-거래내역-ADMIN-approval-visible.png)<br>[스크린샷 2](artifacts/screenshots/02-screenshot.png)
- 화면 재현 기록: [화면 재현 기록 1](https://pub-2726d2ecd69d4e12a4515edca8540068.r2.dev/qa/issues/3143/dev/artifacts/traces/01-trace.zip?v=3515b7d4c5c9c04d85a8985d8d1b50b90bf0e7a8)
- 실행 기록: [실행 기록 1](artifacts/logs/01-거래내역-ADMIN-approval-notification-response.md)<br>[실행 기록 2](artifacts/logs/02-거래내역-ADMIN-approval-status.md)<br>[실행 기록 3](artifacts/logs/03-error-context.md)
- 수동 확인 명령: `npm run qa:debug -- --issue "3143" --env "dev" --role "ADMIN" --case "승인 통보 전송 후 거래 내역 화면에서 승인 거래가 조회되는지 확인"`


## 수동 재현 필요

### 1. ADMIN / [ADMIN] role / 기대 결과와 다름

- 체크 항목: 승인 통보 전송 후 거래 내역 화면에서 승인 거래가 조회되는지 확인
- 필요한 이유: 화면에서 확인한 값이 체크리스트의 기대 결과와 달랐습니다.
- 작업자 알림: [QA 확인 요청] ADMIN / [ADMIN] role / 승인 통보 전송 후 거래 내역 화면에서 승인 거래가 조회되는지 확인: 기대 결과와 다름 상태입니다. npm run qa:debug -- --issue "3143" --env "dev" --role "ADMIN" --case "승인 통보 전송 후 거래 내역 화면에서 승인 거래가 조회되는지 확인" 로 동일 계정과 항목을 다시 열어 확인하세요.
- 직접 열기 명령: `npm run qa:debug -- --issue "3143" --env "dev" --role "ADMIN" --case "승인 통보 전송 후 거래 내역 화면에서 승인 거래가 조회되는지 확인"`
- 작업자가 위 명령을 실행하면 대상 계정의 로그인 세션을 새로 만든 뒤 브라우저가 열립니다.
- 브라우저에서 자동화가 멈춘 화면, 현재 URL, 화면 문구, 다운로드 알림 또는 문서보관함 상태를 확인합니다.
- 확인한 화면과 필요한 조치 내용을 Redmine/GitHub QA 이슈에 남깁니다.


## 스크린샷

- ADMIN / [ADMIN] role / 승인 통보 전송 후 거래 내역 화면에서 승인 거래가 조회되는지 확인: [스크린샷 1](artifacts/screenshots/01-거래내역-ADMIN-approval-visible.png)
- ADMIN / [ADMIN] role / 승인 통보 전송 후 거래 내역 화면에서 승인 거래가 조회되는지 확인: [스크린샷 2](artifacts/screenshots/02-screenshot.png)
- ADMIN / [ADMIN] role / 승인 거래 금액이 1,004원으로 표시되는지 확인: [스크린샷 1](artifacts/screenshots/03-거래내역-ADMIN-approval-visible.png)
- ADMIN / [ADMIN] role / 취소 통보 전송 후 동일 거래가 취소 상태로 반영되는지 확인: [스크린샷 1](artifacts/screenshots/04-거래내역-ADMIN-cancel-visible.png)
- ADMIN / [ADMIN] role / 화면 새로고침 후에도 승인/취소 상태가 유지되는지 확인: [스크린샷 1](artifacts/screenshots/05-거래내역-ADMIN-refresh-persisted.png)

## 화면 재현 기록

- ADMIN / [ADMIN] role / 승인 통보 전송 후 거래 내역 화면에서 승인 거래가 조회되는지 확인: [화면 재현 기록 1](https://pub-2726d2ecd69d4e12a4515edca8540068.r2.dev/qa/issues/3143/dev/artifacts/traces/01-trace.zip?v=3515b7d4c5c9c04d85a8985d8d1b50b90bf0e7a8)
- 화면 재현 기록은 실패한 항목에서 화면 전환과 요청 흐름을 다시 보기 위한 자료입니다.

## 실행 기록

- ADMIN / [ADMIN] role / 승인 통보 전송 후 거래 내역 화면에서 승인 거래가 조회되는지 확인: [실행 기록 1](artifacts/logs/01-거래내역-ADMIN-approval-notification-response.md)
- ADMIN / [ADMIN] role / 승인 통보 전송 후 거래 내역 화면에서 승인 거래가 조회되는지 확인: [실행 기록 2](artifacts/logs/02-거래내역-ADMIN-approval-status.md)
- ADMIN / [ADMIN] role / 승인 통보 전송 후 거래 내역 화면에서 승인 거래가 조회되는지 확인: [실행 기록 3](artifacts/logs/03-error-context.md)
- ADMIN / [ADMIN] role / 승인 거래 금액이 1,004원으로 표시되는지 확인: [실행 기록 1](artifacts/logs/04-거래내역-ADMIN-approval-amount.md)
- ADMIN / [ADMIN] role / 승인 거래 일시가 2026-05-26 15:35:00 기준으로 표시되는지 확인: [실행 기록 1](artifacts/logs/05-거래내역-ADMIN-approval-date.md)
- ADMIN / 카드 정보가 테스트카드 / 244112******9428 기준으로 확인되는지 확인: [실행 기록 1](artifacts/logs/06-거래내역-ADMIN-approval-card-info.md)
- ADMIN / [ADMIN] role / 취소 통보 전송 후 동일 거래가 취소 상태로 반영되는지 확인: [실행 기록 1](artifacts/logs/07-거래내역-ADMIN-cancel-notification-response.md)
- ADMIN / [ADMIN] role / 취소 통보 전송 후 동일 거래가 취소 상태로 반영되는지 확인: [실행 기록 2](artifacts/logs/08-거래내역-ADMIN-cancel-status.md)
- ADMIN / [ADMIN] role / 취소 거래 금액이 1,004원으로 표시되는지 확인: [실행 기록 1](artifacts/logs/09-거래내역-ADMIN-cancel-amount.md)
- ADMIN / [ADMIN] role / 취소 거래 일시가 2026-05-26 15:36:00 기준으로 표시되는지 확인: [실행 기록 1](artifacts/logs/10-거래내역-ADMIN-cancel-date.md)
- ADMIN / [ADMIN] role / 화면 새로고침 후에도 승인/취소 상태가 유지되는지 확인: [실행 기록 1](artifacts/logs/11-거래내역-ADMIN-refresh-persisted.md)

## 자동화 원본 결과

| Scenario | Status | Duration | Screenshot | 화면 재현 기록 | Log | Error |
|---|---:|---:|---|---|---|---|
| 3143/dev/payletter-terminal-notification.spec.ts / [3143][dev] [QA] 페이레터 KoVan 단말기 승인/취소 통보 화면 반영 검증 / [ADMIN] role / 승인 통보 전송 후 거래 내역 화면에서 승인 거래가 조회되는지 확인 | FAIL | 8992ms | [스크린샷 1](artifacts/screenshots/01-거래내역-ADMIN-approval-visible.png)<br>[스크린샷 2](artifacts/screenshots/02-screenshot.png) | [화면 재현 기록 1](https://pub-2726d2ecd69d4e12a4515edca8540068.r2.dev/qa/issues/3143/dev/artifacts/traces/01-trace.zip?v=3515b7d4c5c9c04d85a8985d8d1b50b90bf0e7a8) | [로그 1](artifacts/logs/01-거래내역-ADMIN-approval-notification-response.md)<br>[로그 2](artifacts/logs/02-거래내역-ADMIN-approval-status.md)<br>[로그 3](artifacts/logs/03-error-context.md) | Error: 거래 상태가 승인/결제완료 계열이어야 합니다. 실제=CANCEL / 12026-05-26 15:36:002026-05-26 11:51:13페이레터A_주홍석_법인_페이레터A_주홍석_법인A_주홍석_가맹5_페이레터BP10051610.0001,004-100-903일반정산매 5분지갑정산내역비신고취소000002일시불테스트카드244112******9428-결제통보-인증2026-05-26 15:35:00----0--취소내역000001원거래 아님BP100516A_주홍석_가맹5_페이레터paylettersecret-redacted000000997981 / CANCEL  expect(received).toBe(expected) // Object.is equality |
| 3143/dev/payletter-terminal-notification.spec.ts / [3143][dev] [QA] 페이레터 KoVan 단말기 승인/취소 통보 화면 반영 검증 / [ADMIN] role / 승인 거래 금액이 1,004원으로 표시되는지 확인 | PASS | 9012ms | [스크린샷 1](artifacts/screenshots/03-거래내역-ADMIN-approval-visible.png) |  | [로그 1](artifacts/logs/04-거래내역-ADMIN-approval-amount.md) |  |
| 3143/dev/payletter-terminal-notification.spec.ts / [3143][dev] [QA] 페이레터 KoVan 단말기 승인/취소 통보 화면 반영 검증 / [ADMIN] role / 승인 거래 일시가 2026-05-26 15:35:00 기준으로 표시되는지 확인 | PASS | 1ms |  |  | [로그 1](artifacts/logs/05-거래내역-ADMIN-approval-date.md) |  |
| 3143/dev/payletter-terminal-notification.spec.ts / [3143][dev] [QA] 페이레터 KoVan 단말기 승인/취소 통보 화면 반영 검증 / [ADMIN] role / 카드 정보가 테스트카드 / 244112******9428 기준으로 확인되는지 확인 | PASS | 3ms |  |  | [로그 1](artifacts/logs/06-거래내역-ADMIN-approval-card-info.md) |  |
| 3143/dev/payletter-terminal-notification.spec.ts / [3143][dev] [QA] 페이레터 KoVan 단말기 승인/취소 통보 화면 반영 검증 / [ADMIN] role / 취소 통보 전송 후 동일 거래가 취소 상태로 반영되는지 확인 | PASS | 8963ms | [스크린샷 1](artifacts/screenshots/04-거래내역-ADMIN-cancel-visible.png) |  | [로그 1](artifacts/logs/07-거래내역-ADMIN-cancel-notification-response.md)<br>[로그 2](artifacts/logs/08-거래내역-ADMIN-cancel-status.md) |  |
| 3143/dev/payletter-terminal-notification.spec.ts / [3143][dev] [QA] 페이레터 KoVan 단말기 승인/취소 통보 화면 반영 검증 / [ADMIN] role / 취소 거래 금액이 1,004원으로 표시되는지 확인 | PASS | 1ms |  |  | [로그 1](artifacts/logs/09-거래내역-ADMIN-cancel-amount.md) |  |
| 3143/dev/payletter-terminal-notification.spec.ts / [3143][dev] [QA] 페이레터 KoVan 단말기 승인/취소 통보 화면 반영 검증 / [ADMIN] role / 취소 거래 일시가 2026-05-26 15:36:00 기준으로 표시되는지 확인 | PASS | 0ms |  |  | [로그 1](artifacts/logs/10-거래내역-ADMIN-cancel-date.md) |  |
| 3143/dev/payletter-terminal-notification.spec.ts / [3143][dev] [QA] 페이레터 KoVan 단말기 승인/취소 통보 화면 반영 검증 / [ADMIN] role / 화면 새로고침 후에도 승인/취소 상태가 유지되는지 확인 | PASS | 16842ms | [스크린샷 1](artifacts/screenshots/05-거래내역-ADMIN-refresh-persisted.png) |  | [로그 1](artifacts/logs/11-거래내역-ADMIN-refresh-persisted.md) |  |

## Notes

- Playwright 실행 결과를 기준으로 작성되었습니다.
- 검토 후 `qa:redmine:update`로 report/evidence를 업로드하고 QA subissue 상태를 갱신합니다.
