diff --git a/INDEX.md b/INDEX.md index 849f31a..91f0409 100644 --- a/INDEX.md +++ b/INDEX.md @@ -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개 페이지) | --- diff --git a/changes/20260320_bank_balance_recalc_all_transactions.md b/changes/20260320_bank_balance_recalc_all_transactions.md new file mode 100644 index 0000000..64f3438 --- /dev/null +++ b/changes/20260320_bank_balance_recalc_all_transactions.md @@ -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