feat: P9 #4 — 출금 가용한도를 환수채권 상계 후 실지급액(payable_amount)으로 전환
P9에서 산출하던 payable_amount(=환수 상계 후 실지급액)가 출금 한도에 미반영 (cosmetic)이던 것을 연결. 이제 환수채권 회수가 모바일 출금 가용액을 정확히 줄인다. - V112: 기존 settle_master.payable_amount 백필 = GREATEST(net_amount,0) (V111에서 DEFAULT 0 추가됨 → 구 데이터 보정. clawback 무활동 행만 대상=멱등). - core: SettleMasterMapper.xml cols에 clawback_recovered/carryover/payable_amount 추가, SettleMasterResp 3필드 노출. - api: MobileMeService.withdrawableBalance 한도 산정을 net→payable_amount 기준으로 (payable null이면 max(net,0) 폴백). WithdrawableBalance DTO에 payableAmount 추가, remainingAmount = payable − used. createWithdrawRequest 가드도 자동 반영. - PWA: withdraw.ts 타입 + WithdrawCreate 드롭다운/카드를 '실지급가능(payable)' 표기로. 검증: ./gradlew build(test포함) SUCCESSFUL, PWA tsc 0오류. Flyway V112 적용(schema v112). 백필 150/150 행 payable==max(net,0). 라이브 agent01 withdrawable-balance가 payableAmount 노출 + remaining=payable−used(13492−151000=-137508) 정확. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -199,13 +199,18 @@ public class MobileMeService {
|
||||
if (!agentId.equals(master.getAgentId())) throw new BizException(ErrorCode.FORBIDDEN);
|
||||
|
||||
BigDecimal netAmount = master.getNetAmount() != null ? master.getNetAmount() : BigDecimal.ZERO;
|
||||
// 출금 가용한도는 환수채권 상계 후 실지급액(payable_amount) 기준.
|
||||
// payable_amount 미산정(구 데이터) 시 max(net,0) 로 폴백.
|
||||
BigDecimal payable = master.getPayableAmount();
|
||||
if (payable == null) payable = netAmount.max(BigDecimal.ZERO);
|
||||
BigDecimal used = withdrawMapper.sumActiveAmountByMaster(settleMasterId);
|
||||
if (used == null) used = BigDecimal.ZERO;
|
||||
return WithdrawableBalance.builder()
|
||||
.settleId(settleMasterId)
|
||||
.netAmount(netAmount)
|
||||
.payableAmount(payable)
|
||||
.usedAmount(used)
|
||||
.remainingAmount(netAmount.subtract(used))
|
||||
.remainingAmount(payable.subtract(used))
|
||||
.build();
|
||||
}
|
||||
|
||||
@@ -272,9 +277,10 @@ public class MobileMeService {
|
||||
@Builder
|
||||
public static class WithdrawableBalance {
|
||||
private Long settleId;
|
||||
private BigDecimal netAmount;
|
||||
private BigDecimal netAmount; // 회계 순액(정보용)
|
||||
private BigDecimal payableAmount; // 환수채권 상계 후 실지급가능액 (한도 기준)
|
||||
private BigDecimal usedAmount;
|
||||
private BigDecimal remainingAmount;
|
||||
private BigDecimal remainingAmount; // = payableAmount − usedAmount
|
||||
}
|
||||
|
||||
/** 모바일 출금 신청 — 토큰에서 agentId/requestedBy 강제. */
|
||||
|
||||
Reference in New Issue
Block a user