# QA Report - Redmine #3888 (dev)

- Generated: 2026-07-27T16:38:13+09:00
- Redmine: https://itsm.bix.bz/issues/3888
- QA Redmine: https://itsm.bix.bz/issues/3896
- Subject: [QA] 거래내역 부분상계 금액 중복 누적 방지 검증
- Workflow Status: 완료
- Status: PASS
- Result JSON: artifacts/result-summary.json
- Roles: ADMIN
- Route Candidates: not recorded

## Scope

개발계 기본 ADMIN 계정으로 지정 취소 거래 1건에 가맹점만 부분상계를 40,000원씩 두 번 수행하고 거래내역 API와 목록/상세 화면에서 상계금액 및 완료 상태의 일관성과 중복 방지를 검증한다.

## Checklist

1. 거래내역 화면에서 지정 거래의 취소금액 80,000원, 수수료 10%, 정산금액 72,000원 및 상계 이력 없음 확인
2. 가맹점만 상계 옵션으로 40,000원을 부분상계한 뒤 화면 상계금액 36,000원 확인
3. 같은 거래에 나머지 40,000원을 상계한 뒤 누적 상계금액 72,000원 확인
4. 상계 완료 후 여러 번 새로고침하고 목록에서 나갔다 재진입해도 상계금액이 72,000원으로 유지되고 144,000원으로 중복되지 않는지 확인
5. 거래 목록과 상세 화면의 상계금액 72,000원 및 상계 완료 상태가 동일한지 확인

## Setup Steps

1. [required] 개발계 ADMIN 로그인 및 지정 거래 확인 (admin/ADMIN / kind: state-verify) - 거래일시 2026-07-27 15:44:19, 가맹점 BP100548, 취소금액 80,000원인 취소 거래가 1건이고 상계 이력이 없는지 API와 화면에서 확인한다.
2. [required] 가맹점만 부분상계 2회 처리 (admin/ADMIN / kind: data-update / mutation: persistent / guard: QA_3888_ALLOW_MUTATION) - 지정 거래에 가맹점만 상계 40,000원을 두 번 처리한다. 실행 전 거래의 상계금액이 0원 또는 36,000원 또는 72,000원인지 확인하고, 72,000원인 경우 추가 요청을 보내지 않는다.

## Source Text

주홍석님의 QA 요청입니다. 상계 이벤트가 중복 처리될 때 거래내역의 상계 금액이 두 배로 표시되는 현상을 수정했습니다. 거래일시/취소일시 2026-07-27 15:44:19, PG사 루시페이먼츠, 계약·MID명 A_주홍석_단말기정산한도_루시, 법인 A_주홍석_정산법인, 가맹점 A_주홍석_단말기정산분리_가맹(BP100548), 취소금액 80,000원, 수수료 10%, 정산금액 72,000원이며 상계 이력이 없는 거래를 대상으로 가맹점만 상계 40,000원을 두 번 처리한 뒤 실제 정산금액 기준 36,000원과 누적 72,000원이 표시되고, 새로고침·재진입 후에도 144,000원으로 중복되지 않는지 확인합니다.

## Execution Summary

- Passed: 5
- Failed: 0
- Skipped: 0
- Blocked: 0
- Flaky: 0
- Duration: 97980ms


## 한눈에 보는 결과

| 확인한 항목 | 계정 | 화면 | 수행한 동작 | 결과 | 증거 자료 |
|---|---|---|---|---|---|
| 거래내역 화면에서 지정 거래의 취소금액 80,000원, 수수료 10%, 정산금액 72,000원 및 상계 이력 없음 확인 | 전체 | [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 | 전체 계정으로 [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 항목을 확인 | 기대한 동작과 일치했습니다. | [스크린샷 1](artifacts/screenshots/01-거래내역-ADMIN-initial-state.png)<br>[실행 기록 1](artifacts/logs/01-거래내역-ADMIN-initial-state.md) |
| 가맹점만 상계 옵션으로 40,000원을 부분상계한 뒤 화면 상계금액 36,000원 확인 | 전체 | [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 | 전체 계정으로 [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 항목을 확인 | 기대한 동작과 일치했습니다. | [스크린샷 1](artifacts/screenshots/02-거래내역-ADMIN-first-partial-offset.png)<br>[실행 기록 1](artifacts/logs/02-거래내역-ADMIN-first-partial-offset.md) |
| 같은 거래에 나머지 40,000원을 상계한 뒤 누적 상계금액 72,000원 확인 | 전체 | [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 | 전체 계정으로 [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 항목을 확인 | 기대한 동작과 일치했습니다. | [스크린샷 1](artifacts/screenshots/03-거래내역-ADMIN-second-partial-offset.png)<br>[실행 기록 1](artifacts/logs/03-거래내역-ADMIN-second-partial-offset.md) |
| 상계 완료 후 여러 번 새로고침하고 목록에서 나갔다 재진입해도 상계금액이 72,000원으로 유지되고 144,000원으로 중복되지 않는지 확인 | 전체 | [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 | 전체 계정으로 새로고침과 재조회 전후 거래 ID 출현 횟수를 비교 | 기대한 동작과 일치했습니다. | [스크린샷 1](artifacts/screenshots/04-거래내역-ADMIN-refresh-and-reentry.png)<br>[화면 재현 기록 1](https://pub-2726d2ecd69d4e12a4515edca8540068.r2.dev/qa/issues/3888/dev/artifacts/traces/01-trace.zip?v=649103b98bcc3d3d77c897394d99d4a0c735055c)<br>[실행 기록 1](artifacts/logs/04-거래내역-ADMIN-refresh-and-reentry.md) |
| 거래 목록과 상세 화면의 상계금액 72,000원 및 상계 완료 상태가 동일한지 확인 | 전체 | [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 | 전체 계정으로 [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 항목을 확인 | 기대한 동작과 일치했습니다. | [스크린샷 1](artifacts/screenshots/05-거래내역-ADMIN-detail-partial-offset-1-36-000원.png)<br>[스크린샷 2](artifacts/screenshots/06-거래내역-ADMIN-detail-partial-offset-2-36-000원.png)<br>[스크린샷 3](artifacts/screenshots/07-거래내역-ADMIN-list-detail-consistency.png)<br>[화면 재현 기록 1](https://pub-2726d2ecd69d4e12a4515edca8540068.r2.dev/qa/issues/3888/dev/artifacts/traces/02-trace.zip?v=649103b98bcc3d3d77c897394d99d4a0c735055c)<br>[실행 기록 1](artifacts/logs/05-거래내역-ADMIN-list-detail-consistency.md) |

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

- 실패 또는 확인 불가 항목이 없습니다.

## 수동 재현 필요

- 수동 재현이 필요한 항목이 없습니다.

## 스크린샷

- 전체 / [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 / 거래내역 화면에서 지정 거래의 취소금액 80,000원, 수수료 10%, 정산금액 72,000원 및 상계 이력 없음 확인: [스크린샷 1](artifacts/screenshots/01-거래내역-ADMIN-initial-state.png)
- 전체 / [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 / 가맹점만 상계 옵션으로 40,000원을 부분상계한 뒤 화면 상계금액 36,000원 확인: [스크린샷 1](artifacts/screenshots/02-거래내역-ADMIN-first-partial-offset.png)
- 전체 / [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 / 같은 거래에 나머지 40,000원을 상계한 뒤 누적 상계금액 72,000원 확인: [스크린샷 1](artifacts/screenshots/03-거래내역-ADMIN-second-partial-offset.png)
- 전체 / [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 / 상계 완료 후 여러 번 새로고침하고 목록에서 나갔다 재진입해도 상계금액이 72,000원으로 유지되고 144,000원으로 중복되지 않는지 확인: [스크린샷 1](artifacts/screenshots/04-거래내역-ADMIN-refresh-and-reentry.png)
- 전체 / [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 / 거래 목록과 상세 화면의 상계금액 72,000원 및 상계 완료 상태가 동일한지 확인: [스크린샷 1](artifacts/screenshots/05-거래내역-ADMIN-detail-partial-offset-1-36-000원.png)
- 전체 / [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 / 거래 목록과 상세 화면의 상계금액 72,000원 및 상계 완료 상태가 동일한지 확인: [스크린샷 2](artifacts/screenshots/06-거래내역-ADMIN-detail-partial-offset-2-36-000원.png)
- 전체 / [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 / 거래 목록과 상세 화면의 상계금액 72,000원 및 상계 완료 상태가 동일한지 확인: [스크린샷 3](artifacts/screenshots/07-거래내역-ADMIN-list-detail-consistency.png)

## 화면 재현 기록

- 전체 / [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 / 상계 완료 후 여러 번 새로고침하고 목록에서 나갔다 재진입해도 상계금액이 72,000원으로 유지되고 144,000원으로 중복되지 않는지 확인: [화면 재현 기록 1](https://pub-2726d2ecd69d4e12a4515edca8540068.r2.dev/qa/issues/3888/dev/artifacts/traces/01-trace.zip?v=649103b98bcc3d3d77c897394d99d4a0c735055c)
- 전체 / [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 / 거래 목록과 상세 화면의 상계금액 72,000원 및 상계 완료 상태가 동일한지 확인: [화면 재현 기록 1](https://pub-2726d2ecd69d4e12a4515edca8540068.r2.dev/qa/issues/3888/dev/artifacts/traces/02-trace.zip?v=649103b98bcc3d3d77c897394d99d4a0c735055c)
- 화면 재현 기록은 실패한 항목에서 화면 전환과 요청 흐름을 다시 보기 위한 자료입니다.

## 실행 기록

- 전체 / [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 / 거래내역 화면에서 지정 거래의 취소금액 80,000원, 수수료 10%, 정산금액 72,000원 및 상계 이력 없음 확인: [실행 기록 1](artifacts/logs/01-거래내역-ADMIN-initial-state.md)
- 전체 / [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 / 가맹점만 상계 옵션으로 40,000원을 부분상계한 뒤 화면 상계금액 36,000원 확인: [실행 기록 1](artifacts/logs/02-거래내역-ADMIN-first-partial-offset.md)
- 전체 / [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 / 같은 거래에 나머지 40,000원을 상계한 뒤 누적 상계금액 72,000원 확인: [실행 기록 1](artifacts/logs/03-거래내역-ADMIN-second-partial-offset.md)
- 전체 / [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 / 상계 완료 후 여러 번 새로고침하고 목록에서 나갔다 재진입해도 상계금액이 72,000원으로 유지되고 144,000원으로 중복되지 않는지 확인: [실행 기록 1](artifacts/logs/04-거래내역-ADMIN-refresh-and-reentry.md)
- 전체 / [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 / 거래 목록과 상세 화면의 상계금액 72,000원 및 상계 완료 상태가 동일한지 확인: [실행 기록 1](artifacts/logs/05-거래내역-ADMIN-list-detail-consistency.md)

## 자동화 원본 결과

| Scenario | Status | Duration | Screenshot | 화면 재현 기록 | Log | Error |
|---|---:|---:|---|---|---|---|
| 3888/dev/transaction-offset-dedup.spec.ts / [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 / 거래내역 화면에서 지정 거래의 취소금액 80,000원, 수수료 10%, 정산금액 72,000원 및 상계 이력 없음 확인 | PASS | 10792ms | [스크린샷 1](artifacts/screenshots/01-거래내역-ADMIN-initial-state.png) |  | [로그 1](artifacts/logs/01-거래내역-ADMIN-initial-state.md) |  |
| 3888/dev/transaction-offset-dedup.spec.ts / [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 / 가맹점만 상계 옵션으로 40,000원을 부분상계한 뒤 화면 상계금액 36,000원 확인 | PASS | 15539ms | [스크린샷 1](artifacts/screenshots/02-거래내역-ADMIN-first-partial-offset.png) |  | [로그 1](artifacts/logs/02-거래내역-ADMIN-first-partial-offset.md) |  |
| 3888/dev/transaction-offset-dedup.spec.ts / [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 / 같은 거래에 나머지 40,000원을 상계한 뒤 누적 상계금액 72,000원 확인 | PASS | 19663ms | [스크린샷 1](artifacts/screenshots/03-거래내역-ADMIN-second-partial-offset.png) |  | [로그 1](artifacts/logs/03-거래내역-ADMIN-second-partial-offset.md) |  |
| 3888/dev/transaction-offset-dedup.spec.ts / [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 / 상계 완료 후 여러 번 새로고침하고 목록에서 나갔다 재진입해도 상계금액이 72,000원으로 유지되고 144,000원으로 중복되지 않는지 확인 | PASS | 37062ms | [스크린샷 1](artifacts/screenshots/04-거래내역-ADMIN-refresh-and-reentry.png) | [화면 재현 기록 1](https://pub-2726d2ecd69d4e12a4515edca8540068.r2.dev/qa/issues/3888/dev/artifacts/traces/01-trace.zip?v=649103b98bcc3d3d77c897394d99d4a0c735055c) | [로그 1](artifacts/logs/04-거래내역-ADMIN-refresh-and-reentry.md) |  |
| 3888/dev/transaction-offset-dedup.spec.ts / [3888][dev] [QA] 거래내역 부분상계 금액 중복 누적 방지 검증 / 거래 목록과 상세 화면의 상계금액 72,000원 및 상계 완료 상태가 동일한지 확인 | PASS | 13685ms | [스크린샷 1](artifacts/screenshots/05-거래내역-ADMIN-detail-partial-offset-1-36-000원.png)<br>[스크린샷 2](artifacts/screenshots/06-거래내역-ADMIN-detail-partial-offset-2-36-000원.png)<br>[스크린샷 3](artifacts/screenshots/07-거래내역-ADMIN-list-detail-consistency.png) | [화면 재현 기록 1](https://pub-2726d2ecd69d4e12a4515edca8540068.r2.dev/qa/issues/3888/dev/artifacts/traces/02-trace.zip?v=649103b98bcc3d3d77c897394d99d4a0c735055c) | [로그 1](artifacts/logs/05-거래내역-ADMIN-list-detail-consistency.md) |  |

## Notes

- Playwright 실행 결과를 기준으로 작성되었습니다.
- 1차 부분상계 후 36,000원, 2차 부분상계 후 누적 72,000원으로 표시됐으며, 새로고침과 재진입 후에도 72,000원으로 유지되어 144,000원 중복 누적은 재현되지 않았습니다.
- 정산내역 상세에는 부분상계 2건이 각각 36,000원으로 표시되어 합계 72,000원이었고, 거래 API 상태 `OFFSET` 및 거래 목록의 상계 액션 제거로 상계 완료 상태를 확인했습니다.
- 정산내역 상세의 부분상계 카드 2건에는 처리 상태 `실패` 라벨이 별도로 표시됐습니다. 각 카드의 상계 금액과 거래 단위 상계 완료 상태는 이번 검증 기준과 일치했으며, 해당 라벨은 정산 처리 상태로 구분해 기록했습니다.
- QA subissue에 report/evidence 업로드와 완료 상태 갱신이 반영되었습니다.
