# PARTNER_P2P_POOL_STATUS_GUIDE — 파트너 콘솔 P2P 출금 풀 현황

> 작성: 2026-07-28 (오케스트레이터). 구현: 서브에이전트. DDL 변경 없음.
> 요구: 어드민 "P2P 출금 풀"과 유사한 실시간 풀 현황을 **파트너 콘솔**에 제공 — 파트너가 풀 상태를 보고
> 진행 가능 여부를 직접 판단. 디자인 레퍼런스: TORQ status 페이지(다크, 요약 카드 + 익명 LP 카드 + 30초 갱신).
> 확정 스코프(2026-07-28 사용자): 글로벌 익명 + 내 주문 / TORQ 미표시 / P2P 메뉴 하위 페이지만(대시보드 카드 없음).

## 1. Backend — partner-api

### 1-1. 엔드포인트

`GET /p2p/pool` — 기존 partner-api P2P 컨트롤러 패턴(세션 인증, `PartnerSessionData`) 준수.
기존 P2P 컨트롤러(예: `P2pMemberController`)의 세션/권한 처리 방식을 그대로 따를 것.

### 1-2. 응답 DTO (`P2pPoolStatusResponse`) — 멤버 주석 필수

```
global:
  totalAvailableKrw     long     // 매칭 가능 출금 주문 잔여 합 (= 지금 P2P로 진행 가능한 최대)
  totalAvailableUsdt    BigDecimal // 파트너×네트워크 락 예산 합 (P2pLockService.getAvailableForP2p 합산)
  activeOrderCount      int      // 매칭 가능 주문 수
  minOrderKrw           int      // 최소 거래 금액 (P2pMatchingService.getMinAmount())
  maxSingleOrderKrw     long     // 최대 단일 주문 잔여 (참고 지표)
  usdtKrwRate           BigDecimal // 시세 (PriceService, KRW 환산 표시용)
  topOrders[]           // 익명 주문 카드 상위 5 (잔여 큰 순)
    rank                int
    remainingKrw        long
  byNetwork[]
    networkName         String   // chain_symbol
    availableKrw        long
    orderCount          int
myOrders:                // 요청 파트너 자신의 주문 현황
  activeCount           int      // PENDING/PARTIALLY_MATCHED
  totalRemainingKrw     long
  orders[]              // 활성 주문 목록 (최대 20)
    orderCode, krwAmount, matchedAmount, remainingKrw, status, createdAt
```

**익명성 규칙**: global 쪽에는 파트너/회원 식별 정보(파트너명·ID·주문코드·계좌) 절대 미포함. topOrders는 rank+금액만.

### 1-3. 구현

- `PartnerP2pPoolService` + `PartnerP2pPoolMapper` 신설 (partner-api 모듈 내 — admin-api 의존 금지).
- **매칭 가능 판정 SQL은 admin-api `P2pWithdrawPoolMapper`를 복사하되, common `P2pMatchingMapper.findAvailableWithdrawOrders`의 게이트와 완전 일치시킬 것**:
  `wp.krw_enabled=1 AND wp.p2p_withdraw_enabled=1 AND wp.status='ACTIVE'`(9ceedc8 Fix C 포함) + `wm.trading_paused=0` + 잔여>0 + `usdt_convert_status != 'REQUESTED'` + `bank_account_id IS NOT NULL` + 잔여 ≥ minAmount(더스트 제외).
- USDT 락 예산 합산은 admin `P2pWithdrawPoolService.resolveAvailableUsdt` 패턴 재사용 (core `P2pLockService` 호출).
- 내 주문은 partnerId = 세션 파트너로 필터.
- ⚠️ MyBatis `<script>` 내 `<` 금지 (`&lt;`/`&gt;`), 매퍼는 interface 방식 (XML 금지). CLAUDE.md 규칙.
- 시세는 core `PriceService` 기존 조회 메서드 사용 (신규 구현 금지).

## 2. Frontend — cryptoments-admin repo `partner-ui/`

### 2-1. 페이지 신설: "P2P 출금 풀 현황"

- 위치: partner-ui의 P2P 메뉴 하위. 기존 partner-ui P2P 페이지(라우터/메뉴/API 클라이언트/스타일 컨벤션)를 먼저 조사하고 동일 패턴으로 추가.
- 대시보드 카드는 추가하지 말 것 (확정 스코프).

### 2-2. 레이아웃 (TORQ status 스타일 참고 — 단, partner-ui 기존 테마 준수)

1. **히어로 카드**: "지금 P2P 매칭 가능 금액" — `{minOrderKrw} ~ {totalAvailableKrw} KRW` (≈ USDT 환산 병기). 부연: "분할 매칭 — 총 가용 합 이내면 여러 출금 주문에 나눠 매칭됩니다."
2. **요약 카드 4개**: 매칭 가능 주문 수 / 총 가용 KRW / 총 가용 USDT(락 예산) / 최대 단일 주문(참고).
3. **익명 주문 카드**: #1~#5, 잔여 KRW + 프로그레스 바(최대 대비 비율).
4. **네트워크별 테이블**: 네트워크 / 가용 KRW / 주문 수.
5. **내 주문 섹션**: 내 활성 주문 테이블 (주문코드, 금액, 매칭됨, 잔여, 상태, 등록일).
6. 30초 자동 갱신(polling) + 수동 새로고침 버튼 + 마지막 업데이트 시각.

## 3. 완료 기준

1. 빌드: `./gradlew :partner-api:compileJava` (로컬 Mac — 오케스트레이터 수행) + partner-ui 빌드(`npm run build` — 기존 partner-ui 빌드 방식 확인).
2. 익명성: global 응답에 파트너 식별 정보 0건 (리뷰 필수 확인).
3. SQL 게이트가 매칭 쿼리와 일치 — 화면 수치와 실제 매칭 가능량이 어긋나면 파트너 오판 유발.
4. 커밋: backend `partner: P2P 출금 풀 현황 API`, admin repo `partner-ui: P2P 출금 풀 현황 페이지`.

## 4. 배포 (사용자 ▶)

- backend: `spring:deploy-production` ▶ (admin-api·partner-api→partner)
- frontend: cryptoments-admin repo partner-ui 배포 잡 ▶
