151 lines
4.7 KiB
Markdown
151 lines
4.7 KiB
Markdown
|
|
# 거래처관리
|
||
|
|
|
||
|
|
## 개요
|
||
|
|
|
||
|
|
거래처관리는 회사의 거래처(업체/프리랜서)를 등록하고 관리하는 기능입니다.
|
||
|
|
업종별 분류, 사업자번호/계좌 관리, OCR 명함 인식을 지원합니다.
|
||
|
|
|
||
|
|
- **라우트**: `GET /finance/partners`
|
||
|
|
- **라우트 이름**: `finance.partners`
|
||
|
|
- **UI 기술**: React 18 + Babel (브라우저 트랜스파일링)
|
||
|
|
|
||
|
|
## 파일 구조
|
||
|
|
|
||
|
|
```
|
||
|
|
mng/
|
||
|
|
├── app/Http/Controllers/Finance/
|
||
|
|
│ └── TradingPartnerController.php # 메인 컨트롤러 (5개 메서드)
|
||
|
|
├── app/Models/Finance/
|
||
|
|
│ └── TradingPartner.php # 거래처 모델
|
||
|
|
├── app/Services/
|
||
|
|
│ └── TradingPartnerOcrService.php # OCR 명함 인식 서비스
|
||
|
|
└── resources/views/finance/
|
||
|
|
└── partners.blade.php # React 기반 단일 페이지
|
||
|
|
|
||
|
|
api/
|
||
|
|
└── database/migrations/
|
||
|
|
└── 2026_02_04_221050_create_trading_partners_table.php
|
||
|
|
```
|
||
|
|
|
||
|
|
## 라우트
|
||
|
|
|
||
|
|
```php
|
||
|
|
// routes/web.php (finance prefix 그룹 내)
|
||
|
|
GET /partners → 페이지 렌더링 (HX-Redirect)
|
||
|
|
|
||
|
|
// API 라우트 (partners prefix)
|
||
|
|
GET /partners/list → index() 거래처 목록 (JSON)
|
||
|
|
POST /partners/store → store() 거래처 등록
|
||
|
|
POST /partners/ocr → ocr() OCR 명함 인식
|
||
|
|
PUT /partners/{id} → update() 거래처 수정
|
||
|
|
DELETE /partners/{id} → destroy() 거래처 삭제
|
||
|
|
```
|
||
|
|
|
||
|
|
## 컨트롤러
|
||
|
|
|
||
|
|
### TradingPartnerController
|
||
|
|
|
||
|
|
| 메서드 | HTTP | 설명 |
|
||
|
|
|--------|------|------|
|
||
|
|
| `index()` | GET | 거래처 목록 (검색, 타입/카테고리/상태 필터) |
|
||
|
|
| `store()` | POST | 거래처 등록 (name, type, category 필수) |
|
||
|
|
| `update()` | PUT | 거래처 수정 |
|
||
|
|
| `ocr()` | POST | **OCR 명함 인식** (이미지 → 거래처 정보 추출) |
|
||
|
|
| `destroy()` | DELETE | 거래처 삭제 (Soft Delete) |
|
||
|
|
|
||
|
|
### index() 응답 구조
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"success": true,
|
||
|
|
"data": [
|
||
|
|
{
|
||
|
|
"id": 1,
|
||
|
|
"name": "ABC 솔루션",
|
||
|
|
"type": "vendor",
|
||
|
|
"category": "IT/소프트웨어",
|
||
|
|
"bizNo": "123-45-67890",
|
||
|
|
"bankAccount": "우리은행 1002-xxx-xxxxx",
|
||
|
|
"contact": "02-1234-5678",
|
||
|
|
"email": "info@abc.co.kr",
|
||
|
|
"manager": "김담당",
|
||
|
|
"managerPhone": "010-1234-5678",
|
||
|
|
"status": "active",
|
||
|
|
"memo": ""
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"stats": {
|
||
|
|
"total": 50,
|
||
|
|
"vendor": 35,
|
||
|
|
"freelancer": 15,
|
||
|
|
"active": 42
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## 모델
|
||
|
|
|
||
|
|
### TradingPartner
|
||
|
|
|
||
|
|
**테이블**: `trading_partners`
|
||
|
|
|
||
|
|
| 필드 | 타입 | 설명 |
|
||
|
|
|------|------|------|
|
||
|
|
| `tenant_id` | bigint | 테넌트 ID |
|
||
|
|
| `name` | string(100) | 거래처명 |
|
||
|
|
| `type` | string | **vendor**(업체) / **freelancer**(프리랜서) |
|
||
|
|
| `category` | string(50) | 업종 카테고리 |
|
||
|
|
| `biz_no` | string | 사업자번호 |
|
||
|
|
| `bank_account` | string | 계좌 정보 |
|
||
|
|
| `contact` | string | 연락처 |
|
||
|
|
| `email` | string | 이메일 |
|
||
|
|
| `manager` | string | 담당자명 |
|
||
|
|
| `manager_phone` | string | 담당자 연락처 |
|
||
|
|
| `status` | string | active / inactive |
|
||
|
|
| `memo` | text | 메모 |
|
||
|
|
|
||
|
|
- SoftDeletes 적용
|
||
|
|
- Scope: `active()`, `forTenant($tenantId)`
|
||
|
|
|
||
|
|
## 뷰 구성 (React)
|
||
|
|
|
||
|
|
### partners.blade.php
|
||
|
|
|
||
|
|
```
|
||
|
|
┌─ 페이지 헤더 ──────────────────────
|
||
|
|
│ 제목: "거래처관리"
|
||
|
|
│ [CSV 내보내기] [OCR 등록] [등록] 버튼
|
||
|
|
│
|
||
|
|
├─ 통계 카드 (4열) ──────────────────
|
||
|
|
│ 전체 | 업체 | 프리랜서 | 활성
|
||
|
|
│
|
||
|
|
├─ 필터 영역 ────────────────────────
|
||
|
|
│ 검색 (거래처명, 담당자) | 타입 (업체/프리랜서) | 카테고리 | 상태
|
||
|
|
│
|
||
|
|
├─ 거래처 목록 테이블 ───────────────
|
||
|
|
│ 거래처명 | 타입 | 카테고리 | 사업자번호 | 계좌 | 담당자 | 상태 | 작업
|
||
|
|
│ └─ 타입: 업체(파랑), 프리랜서(보라) 배지
|
||
|
|
│
|
||
|
|
├─ 등록/수정 모달 ───────────────────
|
||
|
|
│ 거래처명, 타입(업체/프리랜서), 카테고리
|
||
|
|
│ 사업자번호, 계좌정보, 연락처, 이메일
|
||
|
|
│ 담당자, 담당자 연락처, 상태, 메모
|
||
|
|
│
|
||
|
|
└─ OCR 모달 ─────────────────────────
|
||
|
|
명함 이미지 업로드 → AI 인식 → 자동 필드 채우기
|
||
|
|
```
|
||
|
|
|
||
|
|
## OCR 명함 인식
|
||
|
|
|
||
|
|
### TradingPartnerOcrService
|
||
|
|
|
||
|
|
명함 이미지를 Claude Vision API로 분석하여 거래처 정보를 자동 추출합니다:
|
||
|
|
- 이미지(Base64) → Claude Vision API 호출
|
||
|
|
- 회사명, 담당자명, 연락처, 이메일, 주소 등 추출
|
||
|
|
- 추출 결과를 등록 폼에 자동 입력
|
||
|
|
|
||
|
|
## HTMX 호환성
|
||
|
|
|
||
|
|
- React 기반 페이지이므로 **HX-Redirect 필요**
|
||
|
|
- `@push('scripts')` 블록에 React/Babel 스크립트 포함
|