Glowb Dev Docs
Admin APIAdmin Finance API

PUT /ai/admin/finance/credit-tx/{txId}

크레딧 트랜잭션 수정 (ledger reverse + new)

크레딧 트랜잭션 수정

원본 트랜잭션을 변경하지 않고, 같은 DB 트랜잭션 내에서:

  1. 원본을 가리키는 reverse 행 추가 (reverseOfTxId = 원본.id, amount = -원본.amount)
  2. amount / reason / memo 를 가진 본 행 추가

두 행 모두 transactionType 은 원본과 동일합니다. BUDGET_ADJUST 가 아닌 경우 Business.remainCredit 도 함께 조정됩니다.

이미 reverse 된 원본 또는 reverse 행 자체 는 재수정 불가 → IllegalStateException (의도상 409 Conflict, 현재는 500 으로 떨어짐).

HTTP 요청

PUT /ai/admin/finance/credit-tx/{txId}?adminId={adminId}
Authorization: Bearer {access_token}
Content-Type: application/json

Path / Query Parameters

파라미터위치타입필수설명
txIdpathLong원본 CreditTransaction id
adminIdqueryString아니오처리자 ID

Request Body

{
  "amount": -300000,
  "reason": "RESHOOT_ADDITIONAL",
  "memo": "재촬영 1회 추가"
}
필드타입필수설명
amountInteger새 금액. 부호는 원본과 동일하게 입력 (예: 캠페인 입금이었으면 음수)
reasonCreditTransactionReason사유
memoString조건부reason=ETC 일 때 필수

동작

T1 = 원본 (그대로 유지, 응답에는 reversed:true 로 노출)
T2 = reverse(T1)      transactionType=T1.transactionType, amount=-T1.amount, reverseOfTxId=T1.id
T3 = replacement      transactionType=T1.transactionType, amount=요청.amount, reason/memo 갱신

BUDGET_ADJUST 가 아닌 경우 remainCredit-T1.amount + 요청.amount 만큼 변동됩니다.

응답 (200 OK)

{
  "status": 200,
  "code": null,
  "message": "트랜잭션 수정 완료",
  "data": {
    "id": 2103,
    "transactionType": "CAMPAIGN_DEPOSIT",
    "amount": -300000,
    "balanceAfter": 1700000,
    "collabNo": 482,
    "candyPaymentId": null,
    "description": "어드민 수정 (replacement)",
    "reason": "RESHOOT_ADDITIONAL",
    "memo": "재촬영 1회 추가",
    "reverseOfTxId": null,
    "createdAt": "2026-05-28T13:45:00",
    "createdBy": "admin01"
  }
}

응답의 data새 본 행(replacement) 입니다. reverse 행은 응답에 직접 포함되지 않지만, 이후 GET .../business|collab/... 호출 시 timeline 에 두 row 모두 노출됩니다.

에러

상태조건설명
400입력 검증 실패amount=0, reason 누락, ETC + memo 누락
404트랜잭션 없음
500*이미 reverse 됨 / reverse 행 자체"이미 취소(reverse)된 트랜잭션입니다."
500*잔액 부족replacement 적용 후 remainCredit < 0

API 테스트

On this page