docs: [계좌내역] 잔액 재계산 전체 거래 적용 변경이력

This commit is contained in:
김보곤
2026-03-20 11:13:57 +09:00
parent 85a568ca68
commit 448f79bccc
2 changed files with 89 additions and 0 deletions

View File

@@ -303,6 +303,7 @@ DB 도메인별:
| [20260320_attendance_calendar_exclude_fix.md](changes/20260320_attendance_calendar_exclude_fix.md) | 근태 캘린더 영업팀 제외 필터 누락 수정 + 운영DB 오류 데이터 삭제 |
| [20260320_leave_list_sort_by_period.md](changes/20260320_leave_list_sort_by_period.md) | 휴가관리 목록 정렬 기준 변경 (created_at → start_date 최신순) |
| [20260320_bank_transaction_trans_office_override.md](changes/20260320_bank_transaction_trans_office_override.md) | 계좌내역 취급점(trans_office) override 수정 기능 추가 |
| [20260320_bank_balance_recalc_all_transactions.md](changes/20260320_bank_balance_recalc_all_transactions.md) | 계좌내역 잔액 재계산을 전체 거래에 적용 (표시 시점 계산) |
| [20260320_sales_to_mng_rd_migration.md](dev/changes/20260320_sales_to_mng_rd_migration.md) | Sales → MNG 연구개발 메뉴 통합 이관 (11개 페이지) |
---

View File

@@ -0,0 +1,88 @@
# 계좌내역 잔액 재계산을 전체 거래에 적용
**날짜:** 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