# 일일자금일보 ## 개요 일일자금일보는 기간별 계좌 입출금 현황을 조회하고 일별 보고서를 생성하는 기능입니다. 바로빌에서 수집된 은행 거래 데이터를 기반으로 날짜별, 계좌별 입출금 집계를 제공합니다. - **라우트**: `GET /finance/daily-fund` - **UI 기술**: React 18 + Babel (브라우저 트랜스파일링) ## 파일 구조 ``` mng/ ├── app/Http/Controllers/Finance/ │ └── DailyFundController.php # 메인 컨트롤러 (6개 메서드) ├── app/Models/Finance/ │ ├── DailyFundTransaction.php # 수동 거래내역 모델 │ └── DailyFundMemo.php # 일별 메모 모델 ├── app/Models/Barobill/ │ ├── BankTransaction.php # 바로빌 거래내역 모델 │ └── BankTransactionOverride.php # 거래 수정 이력 └── resources/views/finance/ └── daily-fund.blade.php # React 기반 UI ``` ## 라우트 ```php // routes/web.php (finance prefix 그룹 내) Route::get('/daily-fund', [DailyFundController::class, 'index'])->name('daily-fund'); // API 엔드포인트 (동일 컨트롤러) Route::get('/daily-fund/period-report', [DailyFundController::class, 'periodReport']); Route::post('/daily-fund', [DailyFundController::class, 'store']); Route::put('/daily-fund/{id}', [DailyFundController::class, 'update']); Route::delete('/daily-fund/{id}', [DailyFundController::class, 'destroy']); Route::post('/daily-fund/memo', [DailyFundController::class, 'saveMemo']); ``` ## 컨트롤러 ### DailyFundController | 메서드 | HTTP | 설명 | |--------|------|------| | `index()` | GET | 특정 날짜 거래내역 조회 | | `store()` | POST | 거래내역 수동 등록 | | `update()` | PUT | 거래내역 수정 | | `destroy()` | DELETE | 거래내역 삭제 | | `saveMemo()` | POST | 일별 메모 저장 | | `periodReport()` | GET | **기간별 일일자금일보** (핵심) | ### periodReport() 핵심 로직 ``` QueryString: start_date, end_date (YYYYMMDD) ↓ BarobillBankTransaction 조회 (trans_date 범위) ↓ BankTransactionOverride 병합 (수정된 적요/내용) ↓ unique_key 기준 중복 제거 ↓ 날짜별 그룹핑 + 계좌별 입출금 집계 ↓ JSON 응답 ``` **응답 구조**: ```json { "dailyReports": [ { "date": "20260211", "dateFormatted": "2026년 2월 11일 수요일", "accounts": [ { "bankName": "우리은행", "accountNum": "1002-xxx", "deposit": 5000000, "withdraw": 1000000, "balance": 50000000 } ], "deposits": [ { "time": "0930", "bankName": "우리은행", "summary": "급여입금", "cast": "본사", "amount": 5000000, "balance": 50000000 } ], "withdrawals": [ ... ], "totalDeposit": 5000000, "totalWithdraw": 1000000 } ] } ``` ## 뷰 구성 (React) ### daily-fund.blade.php ``` ┌─ 기간 선택 컴포넌트 ──────────── │ 날짜 입력 (start_date ~ end_date) │ 월별 단축키 (이번달, 지난달 등) │ ├─ 일별 보고서 반복 렌더링 ──────── │ ┌─ 날짜 헤더 ────────── │ │ 2026년 2월 11일 수요일 │ │ │ ├─ 계좌별 요약 테이블 ── │ │ 은행명 | 계좌번호 | 입금 | 출금 | 잔액 │ │ │ ├─ 입금 상세 내역 ───── │ │ 시간 | 은행 | 적요 | 내용 | 금액 | 잔액 │ │ │ └─ 출금 상세 내역 ───── │ 시간 | 은행 | 적요 | 내용 | 금액 | 잔액 │ └─ 인쇄 버튼 ``` ## 데이터 흐름 ``` React Component (기간 선택) ↓ fetch GET /finance/daily-fund/period-report DailyFundController::periodReport() ↓ BarobillBankTransaction 조회 ↓ (trans_date 범위 필터) BankTransactionOverride 병합 ↓ (수정된 적요/내용 덮어쓰기) unique_key 기준 중복 제거 ↓ 날짜별 + 계좌별 그룹핑 ↓ (입금/출금 분류, 계좌별 집계) JSON 응답 ↓ React 렌더링 (테이블, 통계) ``` ## 데이터베이스 테이블 ### barobill_bank_transactions (주 데이터) | 컬럼 | 타입 | 설명 | |------|------|------| | `tenant_id` | bigint | 테넌트 ID | | `bank_account_num` | string | 계좌번호 | | `bank_name` | string | 은행명 | | `trans_date` | string | 거래일 (YYYYMMDD) | | `trans_time` | string | 거래시간 (HHMM) | | `deposit` | decimal | 입금액 | | `withdraw` | decimal | 출금액 | | `balance` | decimal | 거래 후 잔액 | | `summary` | string | 적요 | | `cast` | string | 내용 | ### daily_fund_transactions (수동 입력) | 컬럼 | 타입 | 설명 | |------|------|------| | `tenant_id` | bigint | 테넌트 ID | | `transaction_date` | date | 거래일 | | `type` | enum | income / expense | | `amount` | decimal | 금액 | | `description` | string | 설명 | ### daily_fund_memos | 컬럼 | 타입 | 설명 | |------|------|------| | `tenant_id` | bigint | 테넌트 ID | | `memo_date` | date | 메모 날짜 | | `memo` | text | 메모 내용 | | `author` | string | 작성자 | ## 핵심 로직 ### 거래 중복 제거 ```php ->unique(fn($tx) => $tx->unique_key) // unique_key = bank_account_num|trans_dt|deposit|withdraw|balance ``` ### 오버라이드 병합 ```php BankTransactionOverride::getByUniqueKeys($keys) // → modified_summary, modified_cast로 원본 적요/내용 덮어쓰기 // → is_overridden 플래그 설정 ``` ### 일별 집계 ``` 거래 목록 → trans_date 기준 그룹핑 → 각 날짜: 계좌별 분류 → 입금 합계, 출금 합계 계산 → 최종 잔액: DESC 정렬 첫 거래의 balance 값 ``` ## HTMX 호환성 - React 기반 페이지이므로 HX-Redirect 필요 - `@push('scripts')` 블록에 React/Babel 스크립트 포함