# 고객사관리 ## 개요 고객사관리는 회사의 고객사 정보를 등급별로 관리하는 기능입니다. 고객사 CRUD, 등급 분류(VIP/Gold/Silver/Bronze), 업종별 관리, 담당자 정보를 지원합니다. - **라우트**: `GET /finance/customers` - **라우트 이름**: `finance.customers` - **UI 기술**: React 18 + Babel (브라우저 트랜스파일링) ## 파일 구조 ``` mng/ ├── app/Http/Controllers/Finance/ │ └── CustomerController.php # 메인 컨트롤러 (4개 메서드) ├── app/Models/Finance/ │ └── Customer.php # 고객사 모델 └── resources/views/finance/ └── customers.blade.php # React 기반 단일 페이지 api/ └── database/migrations/ └── 2026_02_04_230001_create_customers_table.php ``` ## 라우트 ```php // routes/web.php (finance prefix 그룹 내) GET /customers → 페이지 렌더링 (HX-Redirect) // API 라우트 (customers prefix) GET /customers/list → index() 고객사 목록 (JSON) POST /customers/store → store() 고객사 등록 PUT /customers/{id} → update() 고객사 수정 DELETE /customers/{id} → destroy() 고객사 삭제 ``` ## 컨트롤러 ### CustomerController | 메서드 | HTTP | 설명 | |--------|------|------| | `index()` | GET | 고객사 목록 (검색, 등급/상태 필터) | | `store()` | POST | 고객사 등록 (name 필수) | | `update()` | PUT | 고객사 수정 | | `destroy()` | DELETE | 고객사 삭제 (Soft Delete) | ### index() 응답 구조 ```json { "success": true, "data": [...], "stats": { "total": 100, "active": 85, "vip": 10, "inactive": 15 } } ``` ## 모델 ### Customer **테이블**: `customers` | 필드 | 타입 | 설명 | |------|------|------| | `tenant_id` | bigint | 테넌트 ID | | `name` | string(100) | 고객사명 | | `biz_no` | string(20) | 사업자번호 | | `ceo` | string(50) | 대표자명 | | `industry` | string(50) | 업종 | | `grade` | string(20) | 등급 (기본: Silver) | | `contact` | string(50) | 연락처 | | `email` | string(100) | 이메일 | | `address` | string(200) | 주소 | | `manager` | string(50) | 담당자명 | | `manager_phone` | string(20) | 담당자 연락처 | | `status` | string(20) | active / inactive | | `memo` | text | 메모 | - SoftDeletes 적용 - Scope: `forTenant($tenantId)` #### 등급 (grade) | 등급 | 설명 | |------|------| | VIP | 최우수 고객 | | Gold | 우수 고객 | | Silver | 일반 고객 (기본값) | | Bronze | 신규/소규모 고객 | #### 업종 목록 IT/소프트웨어, 제조업, 서비스업, 유통업, 금융업, 기타 ## 뷰 구성 (React) ### customers.blade.php ``` ┌─ 페이지 헤더 ────────────────────── │ 제목: "고객사관리" │ [CSV 내보내기] [등록] 버튼 │ ├─ 통계 카드 (4열) ────────────────── │ 전체 | 활성 | VIP | 비활성 │ ├─ 필터 영역 ──────────────────────── │ 검색 (고객사명, 대표자, 담당자) | 등급 필터 | 상태 필터 │ ├─ 고객사 목록 테이블 ─────────────── │ 고객사명 | 사업자번호 | 대표자 | 업종 | 등급 | 연락처 | 이메일 | 담당자 | 상태 │ └─ 등급: VIP(보라), Gold(노랑), Silver(회색), Bronze(갈색) 배지 │ ├─ 등록/수정 모달 ─────────────────── │ 고객사명, 사업자번호, 대표자명 │ 업종, 등급, 연락처, 이메일, 주소 │ 담당자, 담당자 연락처, 상태, 메모 │ └─ 비어있을 때: 안내 메시지 ``` ## HTMX 호환성 - React 기반 페이지이므로 **HX-Redirect 필요** - `@push('scripts')` 블록에 React/Babel 스크립트 포함