# 계좌내역 잔액 재계산을 전체 거래에 적용

**날짜:** 2026-03-20
**작업자:** Claude Code

## 변경 개요

계좌 입출금 내역의 잔액 재계산 로직을 수동입력 건에만 적용하던 것을, **전체 거래(API + 수동)에 적용**하도록 변경한다.

**배경**: 바로빌 API 거래의 잔액은 은행이 보고한 스냅샷 값으로 DB에 저장된다. 수동입력 건이 중간에 삽입되면, 그 뒤에 오는 API 거래의 잔액이 수동입력 건의 입출금을 반영하지 않아 잔액 체인이 끊어진다. 실제로 2025-09-21 수동입력 건(결산이자)의 잔액 오류가 10-15 API 건까지 연쇄 영향을 주어 마이너스 잔액(-50,905)이 표시되는 문제가 발생했다.

---

## 수정된 파일

| 파일 | 변경 내용 |
|------|----------|
| `mng/app/Http/Controllers/Barobill/EaccountController.php` | `recalcManualBalances()` 메서드 로직 변경 |

---

## 상세 변경 사항

### `recalcManualBalances()` 로직 변경

**기존**: `isManual` 건만 잔액 재계산, API 건은 DB 잔액 그대로 사용

```php
// 기존: 수동입력만 재계산
if (! empty($log['isManual'])) {
    $newBalance = $prevBalance + $deposit - $withdraw;
}
$prevBalance = (float) ($log['balance'] ?? 0);  // API 건은 DB 잔액 사용
```

**변경 후**: 이전 잔액이 확정되면 모든 거래(API/수동 무관)의 잔액을 순차 재계산

```php
// 변경: 모든 거래 재계산
if ($prevBalance !== null) {
    $newBalance = $prevBalance + $deposit - $withdraw;  // 모든 건 재계산
    $prevBalance = $newBalance;
} else {
    $prevBalance = (float) ($log['balance'] ?? 0);  // 첫 거래만 DB 잔액 신뢰
}
```

### 동작 원리

1. `findBaseBalance()`로 조회기간 이전 마지막 잔액 확보 (baseBalance)
2. 시간순(ASC) 정렬 후 첫 거래부터 순차 처리
3. baseBalance가 있으면 모든 거래의 잔액을 `이전잔액 + 입금 - 출금`으로 계산
4. baseBalance가 없으면 첫 거래의 DB 잔액을 기준점으로 사용

### 영향 범위

- DB 데이터는 변경하지 않음 (표시 시점 재계산)
- 수동입력 건 전후의 API 건 잔액이 자동 보정됨
- 바로빌 재동기화와 무관하게 항상 정확한 잔액 표시

---

## 함께 수정한 운영 데이터

| id | 일시 | 필드 | 기존 값 | 수정 값 | 사유 |
|----|------|------|--------:|--------:|------|
| 54 | 2025-09-21 | balance | 1,320 | 17,274,420 | 수동입력 시 잔액 오입력 |
| 63 | 2025-10-15 | balance | -50,905 | 17,223,515 | 이전 잔액 오류 연쇄 영향 |

---

## 테스트 체크리스트

- [x] 운영DB 잔액 수동 수정 완료
- [x] 운영서버 배포 완료
- [ ] 2025-09-17 ~ 10-31 기간 잔액 체인 정상 확인
- [ ] 수동입력 건 추가 시 잔액 자동 계산 확인
- [ ] 전체 계좌 조회 모드에서도 잔액 정상 확인

---

## 관련 문서

- 없음

---

**최종 업데이트**: 2026-03-20
