Files
sam-docs/features/finance/account-transactions.md
김보곤 2950038b72 docs:재무/자금관리 개발문서 작성 (5개 기능)
- 재무 대시보드 (finance-dashboard.md)
- 일일자금일보 (daily-fund-report.md)
- 자금계획일정 (fund-schedules.md)
- 보유계좌관리 (bank-accounts.md)
- 계좌입출금내역 (account-transactions.md)
- README.md (전체 개요)
2026-02-11 16:17:48 +09:00

340 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 계좌입출금내역
## 개요
계좌입출금내역은 바로빌 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 네비게이션 시 전체 페이지 리로드 필수