# 차량목록

## 개요

차량목록은 회사의 법인차량(법인/렌트/리스)을 등록하고 관리하는 기능입니다.
소유형태별 차량 등록, 총 주행거리 자동 계산, 차량 상태 관리 등을 지원합니다.

- **라우트**: `GET /finance/corporate-vehicles`
- **UI 기술**: React 18 + Babel (브라우저 트랜스파일링)

## 파일 구조

```
mng/
├── app/Http/Controllers/Finance/
│   └── CorporateVehicleController.php     # 메인 컨트롤러 (5개 메서드)
├── app/Models/
│   └── CorporateVehicle.php               # 차량 모델
└── resources/views/finance/
    └── corporate-vehicles.blade.php       # React 기반 단일 페이지

api/
└── database/migrations/
    └── 2026_02_02_220000_create_corporate_vehicles_table.php
```

## 라우트

```php
// routes/web.php (finance prefix 그룹 내)
GET    /corporate-vehicles        → index()     페이지 렌더링
GET    /corporate-vehicles/list   → list()      차량 목록 (JSON)
POST   /corporate-vehicles        → store()     차량 등록
PUT    /corporate-vehicles/{id}   → update()    차량 수정
DELETE /corporate-vehicles/{id}   → destroy()   차량 삭제
```

## 컨트롤러

### CorporateVehicleController

| 메서드 | HTTP | 설명 |
|--------|------|------|
| `index()` | GET | React 페이지 렌더링 (HX-Redirect 적용) |
| `list()` | GET | 차량 목록 (필터 + 총 주행거리 계산) |
| `store()` | POST | 차량 등록 |
| `update()` | PUT | 차량 수정 |
| `destroy()` | DELETE | 차량 삭제 |

### list() 핵심 로직

```
필터 파라미터: ownership_type, vehicle_type, status, search
    ↓
CorporateVehicle::where(tenant_id, ...)
    ↓
각 차량별 총 주행거리 계산:
  total_mileage = initial_mileage + SUM(vehicle_logs.distance_km)
    ↓
JSON 응답
```

## 모델

### CorporateVehicle

**테이블**: `corporate_vehicles`

| 필드 | 타입 | 설명 |
|------|------|------|
| `tenant_id` | bigint | 테넌트 ID |
| `plate_number` | string(20) | 차량번호 |
| `model` | string(100) | 차량 모델명 |
| `vehicle_type` | string(20) | 차종 |
| `ownership_type` | enum | **corporate** / rent / lease |
| `year` | year | 연식 |
| `driver` | string(50) | 주 운전자 |
| `status` | enum | **active** / maintenance / disposed |
| `mileage` | int | 현재 주행거리 (정비 기준) |
| `memo` | text | 메모 |

#### 법인 전용 필드

| 필드 | 타입 | 설명 |
|------|------|------|
| `purchase_date` | date | 취득일자 |
| `purchase_price` | int | 취득가액 |

#### 렌트/리스 전용 필드

| 필드 | 타입 | 설명 |
|------|------|------|
| `contract_date` | date | 계약일자 |
| `rent_company` | string | 렌트/리스사 |
| `rent_company_tel` | string | 연락처 |
| `rent_period` | string | 계약기간 |
| `agreed_mileage` | int | 약정주행거리 |
| `vehicle_price` | int | 차량가액 |
| `residual_value` | int | 잔존가치 |
| `deposit` | int | 보증금 |
| `monthly_rent` | int | 월 렌트료 |
| `monthly_rent_tax` | int | 부가세 |
| `insurance_company` | string | 보험사 |
| `insurance_company_tel` | string | 보험사 연락처 |

#### Traits / Scope

- `SoftDeletes` 적용
- Casts: year, mileage, purchase_price, vehicle_price, residual_value, deposit, monthly_rent, monthly_rent_tax → integer

## 뷰 구성 (React)

### corporate-vehicles.blade.php

```
┌─ 페이지 헤더 ──────────────────────
│  제목: "차량목록"
│  검색 | Excel 다운로드 | 차량 등록 버튼
│
├─ 요약 카드 (4열) ──────────────────
│  총 차량 | 법인 취득가 | 월 렌트/리스비 | 총 주행거리
│
├─ 필터 바 ──────────────────────────
│  소유형태: 전체 | 법인 | 렌트 | 리스
│  상태: 전체 | 운행중 | 정비중 | 처분
│
├─ 차량 목록 테이블 (12열 그리드) ──
│  차량번호 | 차종/모델 | 소유형태 | 운전자 | 주행거리 | 상태
│  └─ 소유형태: 법인(보라), 렌트(파랑), 리스(초록) 배지
│  └─ 상태: 운행중(초록), 정비중(노랑), 처분(빨강) 배지
│
├─ 등록/수정 모달 ───────────────────
│  차량번호, 모델명, 차종, 소유형태
│  연식, 주 운전자, 상태, 메모
│  ─────────────────────────
│  [법인일 때] 취득일자, 취득가액
│  [렌트/리스일 때] 계약일, 렌트사, 계약기간,
│    약정주행, 차량가액, 잔존가치, 보증금,
│    월렌트료, 부가세, 보험사
│  ─────────────────────────
│  [삭제] [취소] [등록/저장]
│
└─ 비어있을 때: "등록된 차량이 없습니다" 안내
```

## 데이터 흐름

```
CorporateVehicle (1) ← (N) VehicleLog (총 주행거리 합산)
                     ← (N) VehicleMaintenance (주행거리 갱신)
```

### 주행거리 계산 방식

```
총 주행거리 = CorporateVehicle.mileage (정비 시 갱신 기준값)
            + SUM(vehicle_logs.distance_km) (운행일지 거리 합계)
```

## HTMX 호환성

- React 기반 페이지이므로 **HX-Redirect 필요**
- `@push('scripts')` 블록에 React/Babel 스크립트 포함

---

## 이관 현황 (2026-03-12 기준)

| 항목 | 상태 | 비고 |
|------|:----:|------|
| DB 마이그레이션 | ✅ | `api/database/migrations/2026_02_02_220000_create_corporate_vehicles_table.php` |
| MNG UI (Blade+React) | ✅ | 운영중 |
| API REST 엔드포인트 | ❌ | 미이관 (사진 API만 구현 완료) |
| API Service/Model | 🔶 | 사진: `VehiclePhotoService`, `CorporateVehicle` 모델 구현 완료 |
| API 차량 사진 | ✅ | `VehiclePhotoController` + `StoreVehiclePhotoRequest` 구현 완료 |
| React UI | ❌ | 미이관 |

---

## API 이관 스펙

### 제안 엔드포인트

```
GET    /api/v1/corporate-vehicles          차량 목록 (페이지네이션 + 필터)
GET    /api/v1/corporate-vehicles/{id}     차량 상세 (총 주행거리 포함)
POST   /api/v1/corporate-vehicles          차량 등록
PUT    /api/v1/corporate-vehicles/{id}     차량 수정
DELETE /api/v1/corporate-vehicles/{id}     차량 삭제 (SoftDelete)
GET    /api/v1/corporate-vehicles/dropdown 차량 드롭다운 목록 (id, plate_number, model)
GET    /api/v1/corporate-vehicles/{id}/photos     차량 사진 목록
POST   /api/v1/corporate-vehicles/{id}/photos     차량 사진 업로드 (최대 10장)
DELETE /api/v1/corporate-vehicles/{id}/photos/{fileId}  차량 사진 삭제
```

### 필터 파라미터

| 파라미터 | 타입 | 설명 |
|---------|------|------|
| `ownership_type` | string | corporate / rent / lease |
| `vehicle_type` | string | 승용차 / 승합차 / 화물차 / SUV |
| `status` | string | active / maintenance / disposed |
| `search` | string | 차량번호, 모델, 운전자 검색 |

### 이관 시 고려사항

1. **멀티테넌트**: `BelongsToTenant` trait + `tenant_id` 자동 필터
2. **총 주행거리 계산**: `mileage + SUM(vehicle_logs.distance_km)` — API에서 계산 후 응답에 포함
3. **options 컬럼**: 현재 미적용. 이관 시 렌트/리스 전용 필드를 options JSON으로 통합 검토
4. **Auditable**: API 모델에 `Auditable` trait 적용
5. **FormRequest**: `StoreCorporateVehicleRequest`, `UpdateCorporateVehicleRequest` 분리
6. **차량 사진**: R2 저장, `document_type='corporate_vehicle'` 다형성 관계, 최대 10장, `StoreVehiclePhotoRequest` 동적 max 검증
