# W8 — 파트너 수수료 화면 통합 + 리베이트 어드민 전용

작성 2026-08-19 · repo `cryptoments`(partner-api) + `cryptoments-admin`(partner-ui)
파트너 요청 기반 · 제품 결정: **리베이트는 어드민만 관리한다**

---

## 배경 — 파트너 요청과 실측

파트너 요청 원문 요지:
> 관리자 페이지에 수수료 정보 / P2P 수수료 두 개로 나뉜 걸 하나로.
> 그 안에서 "상위가 받을 몫 입금", "상위가 받을 몫 출금" **두 개만** 나오게.
> 파트너 관리 목록은 수수료율로만 나오니 따로 표기 안 해도 됨.

실측 결과:

```
ACTIVE 파트너 54
  일반 입금 실적 있음  25    ← 전체에서 없애면 이 25개가 깨진다
  P2P 계열만            5    ← 요청자(qndk11 그룹)가 여기
  리베이트 설정         2
  P2P 출금몫 설정       1

요청자 그룹 요율        일반입금 0.2 / P2P입금 0.7 / P2P출금 0.2   ← 셋이 전부 다르다
```

**"두 개"로 합칠 수 없다.** 서로 다른 거래에 붙는 다른 요율이고 값도 다르다.
다만 **요청의 실질은 "6줄이 뒤섞여 뭘 만져야 할지 모르겠다"** 이므로,
**편집 3줄 + 파생값 접기**로 해결한다.

### ⚠️ 일반 입금 수수료를 숨기지 마라

`deposit_fee_rate = 0` 은 **밴드 위반 신호**다 — 그 상태면 일반 정산 집계가 스킵되어
시스템 몫이 유실된다(알려진 함정). 숨기면 이 신호를 못 본다.
**항상 표시하되 파생값과 섞지 않는 것**이 답이다.

---

# A. partner-ui — 수수료 카드 통합

**파일** `views/partner/subpartners/SubPartnerDetailView.vue`

현재 "수수료 정보"와 "P2P 수수료" 두 카드를 **하나로** 합친다.

```
수수료 설정                                       [수정]

  내가 받을 몫                     ← 편집 대상. 이게 전부다
    P2P 입금          0.7 %
    P2P 출금          0.2 %
    일반 입금         0.2 %

  ▸ 참고 (기본 접힘)               ← 파생·검증값. 직접 못 바꾼다
    구매자 실효 부담률   0.9 %
    출금자 실효 부담률   0.2 %
    전액 상한            3 %
    허용 범위 · 원가(하한) · 마진

  ▸ 출금 파트너 리베이트  0.3 %     ← 어드민이 설정한 경우에만. 읽기 전용 (C 참조)
```

## A1. 용어 — "상위가 받을 몫" → "내가 받을 몫"

파트너가 **자기 콘솔에서 하위 파트너를 보는 화면**이다. "상위"는 곧 보고 있는 본인이라
한 번 더 번역해야 읽힌다. **"내가 받을 몫"** 으로 통일하라.

기존 안내 문구("각 퍼센트는 '내 상위가 받을 몫'만 말하고…")도 같이 다듬어라 —
필드 이름이 정확해지면 그 설명이 짧아진다.

## A2. 편집 / 파생 구분이 화면에 드러나야 한다

지금 6개가 같은 무게로 나열돼 있다. **편집 가능한 것만 위에**, 파생값은 접는다.
파생값에는 "직접 설정 불가" 표시를 남겨라(admin 카드에 선례가 있다).

---

# B. partner-ui — 하위 파트너 등록 폼

**파일** `views/partner/subpartners/SubPartnersView.vue` (등록 모달)

- **리베이트 입력 필드 제거** (`p2pRebateRate`)
- 남는 P2P 입력 2개의 라벨을 A1 과 같은 용어로
- 검증 문구도 함께 — 지금 총판 등록 에러가 "내 수익률을 입력해주세요"인데
  실제 입력 필드는 `parentFeeRate` 다. **같은 값을 폼과 목록이 다르게 부른다**
  (목록은 "수수료율", 폼은 "내 수익률"). 용어를 맞춰라

---

# C. 리베이트를 어드민 전용으로

**제품 결정**: 리베이트는 구매자 부담을 올리는 가격 레버라 중앙에서만 관리한다.
**어드민은 이미 편집 기능이 있다**(`admin-ui/.../PartnerP2pFeeCard.vue`) — 어드민은 무변경.

## C1. 백엔드는 건드리지 않는다 (결정)

**UI 에서만 막는다.** 백엔드 차단은 하지 않는다 — 제품 결정.

⚠️ 그래서 **폼이 `p2pRebateRate` 를 계속 보내야 한다.**

```
CreateSubPartnerRequest.p2pRebateRate   @NotNull 이다
  → 폼에서 필드를 지우고 아예 안 보내면 등록이 400 난다
  → 입력 UI 만 없애고 값은 0 을 고정으로 보낸다

UpdateSubPartnerRequest.p2pRebateRate   nullable
  → 수정 요청에서는 필드를 아예 빼면 된다 (기존값 유지)
```

**`@NotNull` 을 지우지 마라.** 백엔드 무변경이 이번 결정이다.

> 감수하는 것: API 를 직접 호출하면 파트너가 여전히 리베이트를 설정할 수 있다.
> 화면에서 막는 것으로 충분하다는 판단이며, 나중에 조여야 하면 그때 백엔드에 넣는다.

## C2. partner-ui — 읽기 표시

- 편집 UI 없음
- **`p2pRebateRate > 0` 일 때만 표시.** 0이면 줄 자체를 그리지 마라 —
  못 바꾸는 0을 보여줘야 할 이유가 없다
- 표시할 때 "관리자 설정" 임을 밝혀라

---

# D. 목록은 이미 정리됨 — 건드리지 마라

직전 커밋(`5835b33`)에서 처리했다.

```
partner-ui 하위 목록   총판 '원가' / 가맹점 '적용' 라벨 병기
admin 파트너 목록      '수수료율' → '입금 수수료율'
```

> 요청자는 "목록은 수수료율로만 나오니 따로 표기 안 해도 된다"고 했지만
> **그 근거는 틀렸다** — 목록의 값은 상속된 원가(`min_fee_rate`)라
> 실제로 0을 받는 파트너도 0.2% 로 보인다(hope 가 그렇다).
> 그래서 상세를 비우면 어디서도 진짜 몫을 못 본다. 상세는 유지한다.

---

## 코딩 규칙

- **백엔드(partner-api)를 건드리지 마라** — 이번 결정은 UI 전용이다
- **DDL 금지. DB 접속 금지**
- **admin-ui 를 건드리지 마라** — 리베이트 편집은 이미 있고 그대로 둔다
- 요율 계산·검증 로직을 새로 만들지 마라. 기존 파생값 계산을 재사용
- Vue 는 기존 스타일. 새 라이브러리 금지

## 완료 기준

```
1  partner-ui 빌드 통과 (타입 에러 0)
2  백엔드 무변경 (partner-api diff 가 비어 있다)
3  수수료 카드가 하나다
4  편집 필드 3개가 위에, 파생값은 접혀 있다
5  '상위가 받을 몫' 문구가 파트너 콘솔에 없다 ('내가 받을 몫')
6  등록 폼에 리베이트 입력이 없다
7  등록 요청이 p2pRebateRate=0 을 계속 보낸다 (@NotNull 이라 빼면 400)
8  수정 요청은 p2pRebateRate 를 아예 보내지 않는다 (기존값 유지)
9  리베이트가 0이면 화면에 줄이 없다
10 admin-ui · partner-api 무변경 (diff 로 증명)
```

## 보고 형식

- 작업별 수정 파일:라인 + 한 줄
- C1 — 등록은 0 고정 전송, 수정은 필드 생략을 어떻게 구현했는지
- 폼·목록 용어를 어떻게 맞췄는지
- admin-ui 무변경 증명
- 지침이 실제 코드와 어긋난 지점 — **고치지 말고 먼저 보고**
- 빌드 결과

## 착수 전 필수 확인

```
partner-ui/src/views/partner/subpartners/SubPartnerDetailView.vue  (두 카드 · 파생값)
partner-ui/src/views/partner/subpartners/SubPartnersView.vue       (등록 폼 · 검증 문구)
partner-api/.../dto/request/CreateSubPartnerRequest.java           (@NotNull 확인 — 읽기만)
partner-api/.../dto/request/UpdateSubPartnerRequest.java           (nullable 확인 — 읽기만)
admin-ui/src/views/partners/tabs/PartnerP2pFeeCard.vue             (파생값 표기 선례 — 읽기만)
```

지침과 다르면 **멈추고 보고하라.**
