# 계좌입출금내역 ## 개요 계좌입출금내역은 바로빌 SOAP API를 통해 은행 거래내역을 실시간으로 조회하고, 회계 분류(계정과목 지정), 분개(1거래→N계정과목), 수동 거래 등록 등을 지원하는 기능입니다. - **라우트**: `GET /finance/account-transactions` - **UI 기술**: React 18 + Babel (브라우저 트랜스파일링) - **컨트롤러**: `EaccountController` (1,772줄) ## 파일 구조 ``` mng/ ├── app/Http/Controllers/Barobill/ │ └── EaccountController.php # 메인 컨트롤러 (1772줄, 16개+ 메서드) ├── app/Models/Barobill/ │ ├── BankTransaction.php # 바로빌 거래내역 모델 │ ├── BankTransactionOverride.php # 거래 수정(적요/내용) │ ├── BankTransactionSplit.php # 거래 분개 │ ├── AccountCode.php # 계정과목 마스터 │ ├── BarobillConfig.php # 바로빌 API 설정 │ └── BarobillMember.php # 테넌트별 바로빌 연동 정보 └── resources/views/barobill/eaccount/ └── index.blade.php # React 기반 단일 페이지 ``` ## 라우트 ### 웹 라우트 ```php // routes/web.php Route::get('/finance/account-transactions', [EaccountController::class, 'index']); ``` ### API 라우트 ```php // routes/web.php (barobill/eaccount prefix) GET /accounts → 등록된 계좌 목록 (바로빌) GET /latest-balances → 계좌별 최신 잔액 (DB) GET /transactions → 거래내역 조회 (API + DB 병합) GET /account-codes → 계정과목 목록 (테넌트별) GET /account-codes/all → 전체 계정과목 POST /account-codes → 계정과목 등록 PUT /account-codes/{id} → 계정과목 수정 DELETE /account-codes/{id} → 계정과목 삭제 POST /save → 거래 저장 (회계 분류) GET /export → Excel 내보내기 POST /save-override → 거래 적요/내용 수정 POST /manual → 수동 거래 등록 PUT /manual/{id} → 수동 거래 수정 DELETE /manual/{id} → 수동 거래 삭제 GET /splits → 분개 내역 조회 POST /splits → 분개 저장 DELETE /splits → 분개 삭제 ``` ## 컨트롤러 ### EaccountController | 메서드 | HTTP | 설명 | |--------|------|------| | `__construct()` | - | SOAP 클라이언트 초기화 (BarobillConfig) | | `index()` | GET | React 페이지 렌더링 (HX-Redirect 적용) | | `accounts()` | GET | 바로빌 등록 계좌 목록 | | `latestBalances()` | GET | DB 기반 최신 잔액 | | `transactions()` | GET | **거래내역 조회** (API + DB 병합) | | `accountCodes()` | GET | 계정과목 목록 | | `accountCodesAll()` | GET | 전체 계정과목 | | `accountCodeStore()` | POST | 계정과목 등록 | | `accountCodeUpdate()` | PUT | 계정과목 수정 | | `accountCodeDestroy()` | DELETE | 계정과목 삭제 | | `save()` | POST | 거래 저장 (계정과목 지정) | | `exportExcel()` | GET | Excel 내보내기 | | `saveOverride()` | POST | 적요/내용 수정 (override) | | `storeManual()` | POST | 수동 거래 등록 | | `updateManual()` | PUT | 수동 거래 수정 | | `destroyManual()` | DELETE | 수동 거래 삭제 | | `splits()` | GET | 분개 내역 조회 | | `saveSplits()` | POST | 분개 저장 | | `deleteSplits()` | DELETE | 분개 삭제 | ## 바로빌 SOAP API 연동 ### 설정 구조 ``` BarobillConfig (barobill_configs 테이블) ├─ environment: 'test' 또는 'production' ├─ cert_key: 인증서 키 ├─ corp_num: 법인번호 └─ base_url: SOAP URL BarobillMember (barobill_members 테이블) ├─ tenant_id: 테넌트별 분리 ├─ barobill_id: 바로빌 로그인 ID ├─ barobill_pwd: 암호화된 비밀번호 └─ server_mode: 'test' 또는 'production' (테넌트별) ``` ### 사용 SOAP 메서드 | WSDL | 메서드 | 기능 | |------|--------|------| | BANKACCOUNT.asmx | `GetBankAccountEx` | 등록된 계좌 목록 | | BANKACCOUNT.asmx | `GetPeriodBankAccountTransLog` | 기간별 거래내역 조회 | ### 에러 코드 | 코드 | 의미 | |------|------| | `-25005` | 데이터 없음 (정상) | | `-25001` | 데이터 없음 (정상) | | 기타 | 에러 메시지 반환 | ## 핵심 로직 ### 거래내역 조회 흐름 (transactions) ``` React 컴포넌트 (날짜/계좌 선택) ↓ GET /barobill/eaccount/transactions ↓ 1. BarobillMember 조회 (barobill_id) ↓ 2. 테넌트별 서버 모드 적용 └─ BarobillConfig 재로드 → SOAP 클라이언트 재초기화 ↓ 3. [단일 계좌 조회] ├─ DB 조회: barobill_bank_transactions (저장된 데이터) ├─ SOAP 호출: GetPeriodBankAccountTransLog ├─ Override 데이터 병합 (수정된 적요) ├─ 수동 거래 병합 (중복 제거) ├─ 분개 데이터 병합 ├─ 잔액 재계산 (기간 전 잔액 기준) └─ 정렬 (최신순) + 페이지네이션 ↓ 4. [전체 계좌 조회] ├─ GetBankAccountEx로 계좌 목록 조회 ├─ 각 계좌별로 3번 반복 └─ 모든 거래 병합 및 정렬 ↓ 5. JSON 응답 ``` ### 거래 고유 키 (unique_key) ```php // BankTransaction 모델 return implode('|', [ $this->bank_account_num, $this->trans_dt, // 거래일시 (int) $this->deposit, (int) $this->withdraw, (int) $this->balance, ]); ``` ### 분개 저장 흐름 ``` React (분개 모달) ↓ POST /barobill/eaccount/splits { originalUniqueKey: "계좌번호|거래일시|입금|출금|잔액", originalData: { bankAccountNum, transDate, ... }, splits: [ { amount: 50000, accountCode: "1000", accountName: "당좌예금" }, { amount: 50000, accountCode: "2000", accountName: "미수금" } ] } ↓ 기존 분개 삭제 → 새 분개 생성 × N ``` ### Override 저장 로직 ``` POST /barobill/eaccount/save-override { uniqueKey: "거래 고유 키", modifiedSummary: "수정된 적요", modifiedCast: "수정된 내용" } ↓ BankTransactionOverride::saveOverride() → 둘 다 null이면 delete → 아니면 upsert ``` ## 모델 ### BankTransaction (Barobill) **테이블**: `barobill_bank_transactions` | 필드 | 설명 | |------|------| | `tenant_id` | 테넌트 ID | | `bank_account_num` | 계좌번호 (하이픈 없음) | | `bank_code` / `bank_name` | 은행 코드/명 | | `trans_date` | 거래일 (YYYYMMDD) | | `trans_time` | 거래시간 (HHMMSS) | | `trans_dt` | 거래일시 (trans_date + trans_time) | | `deposit` / `withdraw` | 입금액 / 출금액 | | `balance` | 거래 후 잔액 | | `summary` / `cast` | 적요 / 내용 | | `account_code` / `account_name` | 계정과목 코드/명 | | `is_manual` | 수동 입력 여부 | ### BankTransactionOverride **테이블**: `barobill_bank_transaction_overrides` | 필드 | 설명 | |------|------| | `unique_key` | 거래 고유 키 | | `modified_summary` | 수정된 적요 | | `modified_cast` | 수정된 내용 | ### BankTransactionSplit **테이블**: `barobill_bank_transaction_splits` | 필드 | 설명 | |------|------| | `original_unique_key` | 원본 거래 고유 키 | | `split_amount` | 분개 금액 | | `account_code` / `account_name` | 계정과목 | | `description` / `memo` | 설명 / 메모 | | `sort_order` | 정렬 순서 | | `bank_account_num` / `trans_dt` / `trans_date` | 원본 거래 정보 | | `original_deposit` / `original_withdraw` | 원본 금액 | ### AccountCode **테이블**: `account_codes` | 필드 | 설명 | |------|------| | `code` | 계정과목 코드 (예: "1000") | | `name` | 계정과목명 (예: "당좌예금") | | `category` | 분류 (자산, 부채, 자본 등) | | `sort_order` | 정렬 순서 | | `is_active` | 활성 여부 | ### BarobillConfig **테이블**: `barobill_configs` | 필드 | 설명 | |------|------| | `name` | 설정명 | | `environment` | 'test' 또는 'production' | | `cert_key` | 바로빌 인증서 키 | | `corp_num` | 법인번호 | | `is_active` | 활성 여부 | ### BarobillMember **테이블**: `barobill_members` | 필드 | 설명 | |------|------| | `tenant_id` | 테넌트 ID | | `biz_no` | 사업자번호 | | `barobill_id` / `barobill_pwd` | 바로빌 로그인 정보 | | `server_mode` | 'test' 또는 'production' | | `status` | active / inactive / pending | ## 뷰 구성 (React) ### index.blade.php ``` ┌─ 테넌트 정보 카드 (Blade) ────────── │ 회사명, 사업자번호, 바로빌 ID │ 바로빌 미연동 경고 (조건부) │ ├─ React 앱 (#eaccount-root) ───────── │ ├─ 계좌 선택 드롭다운 │ ├─ 기간 선택 (이번달, 지난달, D-2~5월 버튼) │ │ │ ├─ 통계 카드 ────────── │ │ 총 입금 | 총 출금 | 거래 건수 │ │ │ ├─ 거래 테이블 ──────── │ │ 번호 | 거래일시 | 적요 | 입금 | 출금 | 잔액 | 계정과목 │ │ ├─ 인라인 편집 (적요, 계정과목) │ │ ├─ 수동 거래: 보라색 표시 │ │ ├─ 숨긴 거래: 회색 처리 │ │ └─ 분개된 거래: 파란색 표시 │ │ │ ├─ 수동 거래 등록 모달 ── │ │ 날짜, 시간, 입금/출금, 금액, 적요, 계정과목 │ │ │ ├─ 분개 모달 ────────── │ │ 원본 거래 정보 → N개 분개 항목 │ │ │ └─ 내보내기/저장 버튼 │ └─ API 엔드포인트 상수 (Blade에서 정의) ``` ### React 주요 기능 | 기능 | 설명 | |------|------| | 계좌별 조회 | 드롭다운에서 계좌 선택 | | 기간 선택 | 월 단위 버튼 (이번달 ~ D-5월) | | 인라인 편집 | 적요, 계정과목 직접 수정 | | 분개 | 1거래 → N계정과목 분할 | | 수동 입력 | API 미제공 거래 추가 | | 거래 숨김 | 특정 거래 숨기기/복원 | | Excel 내보내기 | 조회 데이터 다운로드 | | 잔액 재계산 | 기간 전 잔액 기준 자동 계산 | ## 데이터베이스 테이블 요약 | 테이블 | 역할 | 마이그레이션 (API) | |--------|------|-------------------| | `barobill_bank_transactions` | 거래내역 저장 | `2026_01_23_130000_...` | | `barobill_bank_transaction_overrides` | 적요/내용 수정 | `2026_02_06_095159_...` | | `barobill_bank_transaction_splits` | 분개 데이터 | `2026_02_06_200000_...` | | `account_codes` | 계정과목 마스터 | - | | `barobill_members` | 테넌트별 연동 정보 | - | | `barobill_configs` | API 설정 (환경별) | - | ## HTMX 호환성 - React 기반 페이지이므로 **HX-Redirect 필요** - `@push('scripts')` 블록에 React/Babel 스크립트 포함 - HTMX 네비게이션 시 전체 페이지 리로드 필수