- 법인카드관리: 카드 CRUD, 결제일 휴일조정, 사용금액 집계, 선불결제 - 카드사용내역: 바로빌 SOAP 연동, 분개, 거래숨김, 금액수정 - 차량목록: 법인/렌트/리스 차량 등록, 주행거리 자동계산 - 차량일지: 운행기록, 용도별 통계, 출발↔도착 교환 - 정비이력: 카테고리별 비용 관리, 주행거리 자동갱신 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
204 lines
6.4 KiB
Markdown
204 lines
6.4 KiB
Markdown
# 정비이력
|
|
|
|
## 개요
|
|
|
|
정비이력은 법인차량의 정비, 주유, 보험, 세차, 주차, 통행료 등 비용을 기록하고 관리하는 기능입니다.
|
|
카테고리별 비용 집계, 주행거리 자동 갱신, 기간별 필터링 등을 지원합니다.
|
|
|
|
- **라우트**: `GET /finance/vehicle-maintenance`
|
|
- **UI 기술**: React 18 + Babel (브라우저 트랜스파일링)
|
|
|
|
## 파일 구조
|
|
|
|
```
|
|
mng/
|
|
├── app/Http/Controllers/Finance/
|
|
│ └── VehicleMaintenanceController.php # 메인 컨트롤러 (6개 메서드)
|
|
├── app/Models/
|
|
│ └── VehicleMaintenance.php # 정비이력 모델
|
|
└── resources/views/finance/
|
|
└── vehicle-maintenance.blade.php # React 기반 단일 페이지
|
|
|
|
api/
|
|
└── database/migrations/
|
|
└── 2026_02_03_195000_create_vehicle_maintenances_table.php
|
|
```
|
|
|
|
## 라우트
|
|
|
|
```php
|
|
// routes/web.php (finance prefix 그룹 내)
|
|
GET /vehicle-maintenance → index() 페이지 렌더링
|
|
GET /vehicle-maintenance/vehicles → vehicles() 차량 목록 (드롭다운용)
|
|
GET /vehicle-maintenance/list → list() 정비이력 목록 (JSON)
|
|
POST /vehicle-maintenance → store() 정비 등록
|
|
PUT /vehicle-maintenance/{id} → update() 정비 수정
|
|
DELETE /vehicle-maintenance/{id} → destroy() 정비 삭제
|
|
```
|
|
|
|
## 컨트롤러
|
|
|
|
### VehicleMaintenanceController
|
|
|
|
| 메서드 | HTTP | 설명 |
|
|
|--------|------|------|
|
|
| `index()` | GET | React 페이지 렌더링 (HX-Redirect 적용) |
|
|
| `vehicles()` | GET | 전체 차량 목록 (드롭다운 선택용) |
|
|
| `list()` | GET | 정비이력 목록 (필터, 검색, 차량 관계 포함) |
|
|
| `store()` | POST | 정비 등록 + **차량 주행거리 갱신** |
|
|
| `update()` | PUT | 정비 수정 + **차량 주행거리 갱신** |
|
|
| `destroy()` | DELETE | 정비 삭제 |
|
|
|
|
### list() 필터 파라미터
|
|
|
|
| 파라미터 | 설명 |
|
|
|---------|------|
|
|
| `vehicle_id` | 차량 ID |
|
|
| `category` | 카테고리 (주유, 정비, 보험 등) |
|
|
| `start_date` / `end_date` | 기간 (기본: 최근 3개월) |
|
|
| `search` | 검색 (설명, 업체명, 메모) |
|
|
|
|
### 주행거리 자동 갱신
|
|
|
|
```php
|
|
// store() / update() 에서
|
|
if ($request->mileage) {
|
|
$vehicle = CorporateVehicle::find($request->vehicle_id);
|
|
$vehicle->update(['mileage' => $request->mileage]);
|
|
}
|
|
```
|
|
|
|
정비 등록/수정 시 입력한 주행거리가 해당 차량의 기준 주행거리(mileage)를 갱신합니다.
|
|
|
|
## 모델
|
|
|
|
### VehicleMaintenance
|
|
|
|
**테이블**: `vehicle_maintenances`
|
|
|
|
| 필드 | 타입 | 설명 |
|
|
|------|------|------|
|
|
| `tenant_id` | bigint | 테넌트 ID |
|
|
| `vehicle_id` | bigint | 차량 FK (corporate_vehicles) |
|
|
| `date` | date | 정비일 |
|
|
| `category` | string(20) | 카테고리 |
|
|
| `description` | string(200) | 설명 |
|
|
| `amount` | bigint | 금액 |
|
|
| `mileage` | int | 정비 시 주행거리 |
|
|
| `vendor` | string(100) | 업체명 |
|
|
| `memo` | text | 메모 |
|
|
|
|
#### 카테고리 목록
|
|
|
|
| 카테고리 | 설명 | 아이콘/색상 |
|
|
|---------|------|------------|
|
|
| `주유` | 연료비 | Fuel / amber |
|
|
| `정비` | 차량 정비/수리 | Wrench / blue |
|
|
| `보험` | 자동차 보험료 | Shield / emerald |
|
|
| `세차` | 세차 비용 | Droplets / cyan |
|
|
| `주차` | 주차 비용 | ParkingCircle / purple |
|
|
| `통행료` | 고속도로 등 통행료 | Route / orange |
|
|
| `검사` | 정기검사/점검 | ClipboardCheck / indigo |
|
|
| `기타` | 기타 비용 | MoreHorizontal / gray |
|
|
|
|
#### Relationships
|
|
|
|
```php
|
|
$maintenance->vehicle // BelongsTo CorporateVehicle
|
|
$maintenance->tenant // BelongsTo Tenant
|
|
```
|
|
|
|
#### Static 메서드
|
|
|
|
```php
|
|
VehicleMaintenance::getCategories()
|
|
// ['주유', '정비', '보험', '세차', '주차', '통행료', '검사', '기타']
|
|
```
|
|
|
|
## 뷰 구성 (React)
|
|
|
|
### vehicle-maintenance.blade.php
|
|
|
|
```
|
|
┌─ 페이지 헤더 ──────────────────────
|
|
│ 제목: "정비이력"
|
|
│ 새로고침 | Excel 다운로드 | 정비 등록 버튼
|
|
│
|
|
├─ 요약 카드 (4열) ──────────────────
|
|
│ 총 정비비용 | 주유비 | 정비비 | 기타비용
|
|
│ (기간 내 합산)
|
|
│
|
|
├─ 필터 영역 ────────────────────────
|
|
│ 기간: 시작일 ~ 종료일 (기본: 최근 3개월)
|
|
│ 카테고리: 전체 | 주유 | 정비 | 보험 | 세차 | 주차 | 통행료 | 검사 | 기타
|
|
│ 차량: 드롭다운 선택
|
|
│ 검색: 설명, 업체명 검색
|
|
│
|
|
├─ 정비이력 테이블 ──────────────────
|
|
│ 날짜 | 차량 | 카테고리 | 설명 | 금액 | 주행거리 | 작업
|
|
│ └─ 카테고리: 컬러 배지 (카테고리별 고유 색상)
|
|
│ └─ 금액: 원 단위 포맷
|
|
│ └─ 작업: 수정/삭제 버튼
|
|
│
|
|
├─ 등록/수정 모달 ───────────────────
|
|
│ 차량 선택, 날짜, 카테고리
|
|
│ 설명, 금액, 주행거리, 업체명, 메모
|
|
│ [삭제] [취소] [등록/저장]
|
|
│
|
|
└─ 비어있을 때: 안내 메시지
|
|
```
|
|
|
|
## 핵심 로직
|
|
|
|
### 비용 집계
|
|
|
|
```
|
|
요약 카드 계산:
|
|
총 정비비용 = 조회 기간 내 모든 정비 금액 합계
|
|
주유비 = category === '주유' 인 금액 합계
|
|
정비비 = category === '정비' 인 금액 합계
|
|
기타비용 = 나머지 카테고리 금액 합계
|
|
```
|
|
|
|
### 차량 주행거리 연동
|
|
|
|
```
|
|
정비 등록/수정 시 mileage 입력
|
|
↓
|
|
해당 차량(corporate_vehicles)의 mileage 필드 갱신
|
|
↓
|
|
차량목록에서 총 주행거리 재계산:
|
|
total_mileage = mileage + SUM(vehicle_logs.distance_km)
|
|
```
|
|
|
|
## 데이터베이스 스키마
|
|
|
|
### vehicle_maintenances
|
|
|
|
```sql
|
|
CREATE TABLE vehicle_maintenances (
|
|
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
|
tenant_id BIGINT NOT NULL,
|
|
vehicle_id BIGINT NOT NULL,
|
|
date DATE NOT NULL,
|
|
category VARCHAR(20) NOT NULL,
|
|
description VARCHAR(200),
|
|
amount BIGINT UNSIGNED DEFAULT 0,
|
|
mileage INT UNSIGNED,
|
|
vendor VARCHAR(100),
|
|
memo TEXT,
|
|
created_at TIMESTAMP,
|
|
updated_at TIMESTAMP,
|
|
deleted_at TIMESTAMP,
|
|
INDEX (tenant_id, vehicle_id, date),
|
|
INDEX (tenant_id, category),
|
|
FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (vehicle_id) REFERENCES corporate_vehicles(id) ON DELETE CASCADE
|
|
);
|
|
```
|
|
|
|
## HTMX 호환성
|
|
|
|
- React 기반 페이지이므로 **HX-Redirect 필요**
|
|
- `@push('scripts')` 블록에 React/Babel 스크립트 포함
|