Admin APIAdmin Finance API
DELETE /ai/admin/finance/ledger/{txId}
크레딧 이력 소프트 삭제 (이후 balance_after 재계산)
크레딧 이력 삭제 (soft)
deletedAt 을 찍어 원장에서 제외합니다. 행 자체는 DB 에 남지만 조회·집계·재계산 어디에도
잡히지 않고, 삭제 지점 이후 행의 balanceAfter 는 삭제분을 뺀 값으로 재계산됩니다.
물리 삭제를 하지 않는 이유는 감사 로그(TB_CREDIT_TRANSACTION_AUDIT)의 tx_id 가 가리킬
대상을 남겨두기 위해서입니다.
HTTP 요청
DELETE /ai/admin/finance/ledger/{txId}?keepBalance=false&adminId={adminId}
Authorization: Bearer {access_token}Path / Query Parameters
| 파라미터 | 위치 | 타입 | 필수 | 설명 |
|---|---|---|---|---|
txId | path | Long | 예 | 삭제할 원장 행 id |
keepBalance | query | boolean | 아니오 | true 면 기업 잔액은 건드리지 않고 원장 줄만 정리. 기본 false |
adminId | query | String | 아니오 | 처리자 ID |
재계산 동작
[삭제 전] [07-05 행 삭제]
07-01 +100,000 → 100,000 07-01 +100,000 → 100,000 (그대로)
07-05 -30,000 → 70,000 07-05 -30,000 ← 삭제 (원장에서 제외)
07-09 -20,000 → 50,000 07-09 -20,000 → 80,000 ← 재계산
remainCredit: 50,000 → 80,000 (델타 +30,000)삭제는 그 금액이 반영된 것의 반대입니다. 충전 행을 지우면 잔액이 줄고, 차감 행을 지우면 위 예시처럼 잔액이 늘어납니다.
잔액은 그대로 두고 이력만 지우기
keepBalance=true 를 쓰면 balance_after 재계산은 그대로 돌지만 기업 잔액은 손대지 않습니다.
잘못 들어간 이력을 지우되 실제 잔액은 지금 값이 맞을 때 씁니다.
keepBalance=false (기본) | keepBalance=true | |
|---|---|---|
| 삭제 행 | deletedAt 기록 | 동일 |
이후 행 balanceAfter | 재계산 | 동일하게 재계산 |
기업 remainCredit | 삭제분만큼 이동 | 변화 없음 |
응답 balanceMismatch | false | true |
keepBalance=true 로 지우면 잔액과 원장 마지막 값이 의도적으로 어긋난 상태가 됩니다.
그래서 응답의 balanceMismatch 가 true 로 남습니다. 이건 오류가 아니라 의도한 결과이므로,
화면에서 경고로 띄우지 마세요.
그 상태에서 원장 전체 재계산을 apply=true 로
돌리면 잔액이 원장 값으로 덮어써집니다. 재계산은 잔액을 원장 마지막 값에 맞추는 동작이라,
keepBalance 로 남겨둔 차이를 "어긋난 것"으로 보고 지웁니다. 두 기능을 같은 기업에 함께 쓸
때는 순서를 신경 쓰세요.
삭제가 함께 반영되는 곳
| 대상 | 반영 |
|---|---|
| 어드민 파이낸스 타임라인 (기업/캠페인) | 목록에서 제외 |
캠페인 입금 합계 (sumCampaignDeposits*) | 합계에서 제외 |
| 캠페인 최초 입금액 (착수금 게이트 분모) | 후보에서 제외 |
| 에이전시 고객사 크레딧 내역 | 목록에서 제외 |
응답 (200 OK)
{
"status": 200,
"code": null,
"message": "크레딧 이력 삭제 완료",
"data": {
"transaction": {
"id": 2103,
"amount": -30000,
"occurredAt": "2026-07-05T10:00:00",
"deletedAt": "2026-08-11T14:20:03"
},
"recalculatedCount": 1,
"newRemainCredit": 80000,
"expectedRemainCredit": 80000,
"balanceMismatch": false
}
}에러
| 상태 | 조건 |
|---|---|
409 | 이미 삭제된 행 / reverse 행 자체 / 이미 reverse 된 원본 (FINANCE_002) |
503 | 기업 행 락 경합 (DB_LOCK_ERROR) — 재시도 |