# Partner Gas Cost Display Fix Guide

## 문제

partner-ui 가스비 기록 화면에서:
- **네트워크 컬럼** → `-` 표시 (networkCode 누락)
- **네이티브 수수료** → `0.000001050 ???` (토큰 심볼 누락)

## 원인

`PartnerGasMapper.searchGasCosts()` SQL에서 `bn.chain_symbol AS network_code`를 JOIN하지만,
반환 타입이 `XPage<GasCostRecord>` (entity) → entity에 `networkCode` 필드 없음 → MyBatis가 무시.

CLAUDE.md 규칙: *"Entity에 @XIgnoreColumn으로 JOIN 데이터 추가 금지. JOIN 결과는 별도 데이터 클래스로 분리"*

## DB 데이터 확인

`fee_native` 컬럼: `decimal(36,0)` — **wei/sun 정수 단위** 저장.
partner-ui `formatFeeNative()`의 `10^decimals` 나눗셈 로직은 정확함. networkCode만 전달하면 해결.

## 수정 사항

### 1. GasCostResponse DTO 생성

**파일**: `partner-api/src/main/java/com/cryptoments/partnerapi/dto/response/GasCostResponse.java`

```java
package com.cryptoments.partnerapi.dto.response;

import com.cryptoments.common.enums.BillingStatus;
import com.cryptoments.common.enums.GasCostReferenceType;
import com.cryptoments.common.enums.GasCostTxType;
import lombok.*;

import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 가스비 기록 응답 DTO.
 * GasCostRecord entity + blockchain_networks JOIN 결과.
 */
@Getter @Setter @Builder
@NoArgsConstructor @AllArgsConstructor
public class GasCostResponse {

    /** PK */
    private Long id;

    /** partners.id 참조 */
    private Long partnerId;

    /** blockchain_networks.id 참조 */
    private Long networkId;

    /** 네트워크 코드 (JOIN: bn.chain_symbol) — BSC, POLYGON, ETHEREUM, TRON */
    private String networkCode;

    /** COLLECTION / WITHDRAWAL / GAS_SUPPORT / APPROVE / ENERGY_RENTAL */
    private GasCostTxType txType;

    /** 트랜잭션 해시 */
    private String txHash;

    /** COLLECTION_QUEUE, WITHDRAWAL, WALLET_APPROVAL */
    private GasCostReferenceType referenceType;

    /** 참조 엔티티 ID */
    private Long referenceId;

    /** 실제 가스비 — 네이티브 토큰 최소 단위 (wei/sun) */
    private BigDecimal feeNative;

    /** 환산 시점 네이티브 토큰 USD 시세 */
    private BigDecimal nativePriceUsd;

    /** 실제 가스비 — USD 환산 */
    private BigDecimal feeUsd;

    /** PENDING / INVOICED / WAIVED */
    private BillingStatus billingStatus;

    /** 청구서 ID */
    private Long invoiceId;

    /** 생성 시각 */
    private LocalDateTime createdAt;

    /** 수정 시각 */
    private LocalDateTime updatedAt;
}
```

### 2. PartnerGasMapper 수정

**파일**: `partner-api/src/main/java/com/cryptoments/partnerapi/mapper/PartnerGasMapper.java`

**변경**: `searchGasCosts()` 반환 타입 + cls 파라미터

```java
// ❌ Before
XPage<GasCostRecord> searchGasCosts(XPagination pagination, ..., Class<?> cls);

// ✅ After
XPage<GasCostResponse> searchGasCosts(XPagination pagination, ..., Class<?> cls);
```

**import 변경**:
```java
// 추가
import com.cryptoments.partnerapi.dto.response.GasCostResponse;
// GasCostRecord import는 더 이상 사용하지 않으면 제거
```

**SQL은 변경 없음** — 이미 `bn.chain_symbol AS network_code` JOIN이 있으므로 그대로 사용.

### 3. PartnerGasService 수정

**파일**: `partner-api/src/main/java/com/cryptoments/partnerapi/service/PartnerGasService.java`

```java
// ❌ Before
public XPage<GasCostRecord> getGasCosts(XPagination pagination, Long partnerId,
                                         String from, String to, Long networkId) {
    return partnerGasMapper.searchGasCosts(pagination, partnerId, from, to, networkId,
            GasCostRecord.class);
}

// ✅ After
public XPage<GasCostResponse> getGasCosts(XPagination pagination, Long partnerId,
                                            String from, String to, Long networkId) {
    return partnerGasMapper.searchGasCosts(pagination, partnerId, from, to, networkId,
            GasCostResponse.class);
}
```

**import 변경**:
```java
// 추가
import com.cryptoments.partnerapi.dto.response.GasCostResponse;
// GasCostRecord import 제거 (더 이상 사용하지 않으면)
```

### 4. PartnerGasController 수정

**파일**: `partner-api/src/main/java/com/cryptoments/partnerapi/controller/PartnerGasController.java`

```java
// ❌ Before
public XPage<GasCostRecord> getGasCosts(...)

// ✅ After
public XPage<GasCostResponse> getGasCosts(...)
```

**import 변경**:
```java
// 추가
import com.cryptoments.partnerapi.dto.response.GasCostResponse;
// GasCostRecord import 제거
```

## SQL → DTO 매핑 확인

| SQL alias | DTO 필드 | 비고 |
|---|---|---|
| `g.*` (전체 컬럼) | 동일 필드명 | camelCase ↔ snake_case 자동 매핑 |
| `bn.chain_symbol AS network_code` | `networkCode` | **이것이 핵심 — 기존에 누락되던 필드** |

## partner-ui 변경 불필요

partner-ui 코드는 이미 정상:
- `GasCostsView.vue`: `row.networkCode` 사용
- `format.ts`: `formatFeeNative(feeNative, networkCode)` — NATIVE_TOKEN_MAP에서 심볼+소수점 변환
- `gas.ts` 타입: `networkCode?: string` 정의됨

API가 `networkCode`를 정상 반환하면 자동으로 해결됨.

## 빌드 확인

```bash
./gradlew :partner-api:compileJava
```

## 체크리스트

- [ ] GasCostResponse DTO 생성
- [ ] PartnerGasMapper 반환 타입 변경 (GasCostRecord → GasCostResponse)
- [ ] PartnerGasService 반환 타입 + cls 파라미터 변경
- [ ] PartnerGasController 반환 타입 변경
- [ ] `./gradlew :partner-api:compileJava` 성공
- [ ] 배포 후 partner-ui에서 네트워크 컬럼 + 네이티브 수수료 표시 확인
