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:
GA Pro
2026-06-05 00:29:50 +09:00
parent 51ee03453c
commit 90256a19a1
6 changed files with 27 additions and 5 deletions
+2
View File
@@ -29,6 +29,7 @@ export interface SettleMasterResp {
settleId: number;
settleMonth: string;
netAmount?: number;
payableAmount?: number;
grossAmount?: number;
status?: string;
statusName?: string;
@@ -44,6 +45,7 @@ export interface WithdrawCreateReq {
export interface WithdrawableBalance {
settleId: number;
netAmount: number;
payableAmount: number;
usedAmount: number;
remainingAmount: number;
}
+2 -2
View File
@@ -36,7 +36,7 @@ export default function WithdrawCreate() {
const pickerColumns: PickerColumn[] = useMemo(
() => [
settleMasters.map((s: SettleMasterResp) => ({
label: `${s.settleMonth} · 실수령 ${fmt(s.netAmount)}`,
label: `${s.settleMonth} · 실지급가능 ${fmt(s.payableAmount ?? s.netAmount)}`,
value: String(s.settleId),
})),
],
@@ -94,7 +94,7 @@ export default function WithdrawCreate() {
{fmt(balance.remainingAmount)}
</div>
<div style={{ color: '#999', fontSize: 12, marginTop: 4 }}>
{fmt(balance.netAmount)} · {fmt(balance.usedAmount)}
{fmt(balance.payableAmount)} · {fmt(balance.usedAmount)}
</div>
</div>
)}