Admin APIAdmin Finance API
PUT /ai/admin/finance/ledger/{txId}
크레딧 이력 in-place 수정 (reverse 행 없음, 이후 balance_after 재계산)
크레딧 이력 수정 (in-place)
원장 행의 금액·발생일·비고를 그 자리에서 고칩니다. reverse 행을 만들지 않으므로 행 수와
트랜잭션 id 가 변하지 않고, 수정 지점 이후 행의 balanceAfter 만 다시 계산됩니다.
변경 전/후 스냅샷은 TB_CREDIT_TRANSACTION_AUDIT 에 남습니다 (원장 화면은 깔끔하게, 추적성은 감사 로그로).
레거시 reverse 쌍은 거부합니다 (409). 스스로 reverse 행이거나, 다른 행이 이 행을
reverse 한 경우입니다. 그 행들은 "원본 불변 + reverse 추가" 규약 위에서 짝이 맞춰져 있어
한쪽만 in-place 로 고치면 쌍이 깨집니다. 기존 PUT /credit-tx/{txId} 를 쓰세요.
HTTP 요청
PUT /ai/admin/finance/ledger/{txId}?adminId={adminId}
Authorization: Bearer {access_token}
Content-Type: application/jsonPath / Query Parameters
| 파라미터 | 위치 | 타입 | 필수 | 설명 |
|---|---|---|---|---|
txId | path | Long | 예 | 수정할 원장 행 id |
adminId | query | String | 아니오 | 처리자 ID |
Request Body
null 필드는 "변경 없음" 을 뜻합니다.
{
"occurredAt": "2026-07-03T10:00:00",
"amount": -50000,
"description": "금액 정정",
"reason": "ETC",
"memo": "세금계산서 대사",
"provisional": null
}| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
occurredAt | LocalDateTime | 아니오 | 새 발생일. 미래 시각은 거부 |
amount | Integer | 아니오 | 새 금액. 0 불가 |
description | String | 아니오 | 새 비고 |
reason | CreditTransactionReason | 아니오 | 새 사유 |
memo | String | 조건부 | 최종 reason 이 ETC 면 필수 |
provisional | Boolean | 아니오 | 임시 크레딧 여부 |
재계산 동작
금액만 바꾼 경우
[수정 전] [07-05 행을 -50,000 으로 수정]
07-01 +100,000 → 100,000 07-01 +100,000 → 100,000 (그대로)
07-05 -30,000 → 70,000 07-05 -50,000 → 50,000 ← 수정
07-09 -20,000 → 50,000 07-09 -20,000 → 30,000 ← 재계산
remainCredit: 50,000 → 30,000 (델타 -20,000)발생일을 앞으로 옮긴 경우
원장 순서 자체가 바뀝니다. 이때 재계산 시작점은 기존 발생일과 새 발생일 중 더 이른 쪽입니다.
[07-09 행을 07-03 으로 이동]
07-01 +100,000 → 100,000 (그대로)
07-03 -20,000 → 80,000 ← 옮겨온 행
07-05 -30,000 → 50,000 ← 재계산
금액이 그대로라 remainCredit 은 변하지 않음응답 (200 OK)
POST .../entry 와 동일한 형태입니다.
{
"status": 200,
"code": null,
"message": "크레딧 이력 수정 완료",
"data": {
"transaction": { "id": 2103, "amount": -50000, "balanceAfter": 50000, "occurredAt": "2026-07-05T10:00:00" },
"recalculatedCount": 2,
"newRemainCredit": 30000,
"expectedRemainCredit": 30000,
"balanceMismatch": false
}
}에러
| 상태 | 조건 |
|---|---|
400 | amount=0, 미래 occurredAt, reason=ETC + memo 누락 |
409 | 이미 삭제된 행 / reverse 행 자체 / 이미 reverse 된 원본 (FINANCE_002) |
503 | 기업 행 락 경합 (DB_LOCK_ERROR) — 재시도 |