# 견적 자동 산출 시스템 가이드

## 개요

견적 자동 산출 시스템은 **분류별 단가 수식**에 맞게 품목별 단가를 자동으로 계산하는 기능입니다.

기존 방식과의 차이점:
- **기존**: 제품의 BOM에서 산출 수식에 맞게 나온 품목과 수량에 단가관리의 단가를 곱함
- **현재**: 분류별 단가 수식에 맞게 품목별 단가를 계산하여 적용

## 시스템 구성

### 1. 데이터 구조

#### 분류 관리 (CategoryGroup)
제품과 부품을 분류 그룹으로 묶어 관리합니다.

```typescript
interface CategoryGroup {
  id: string;
  name: string;                // 그룹명 (예: "스크린 제품", "철재 제품")
  description?: string;
  categories: string[];        // 포함된 카테고리 목록
  createdAt: string;
}
```

**샘플 데이터:**
- CG-001: 스크린 제품 (스크린, 오픈사이즈, 제작사이즈, 실리카, 와이어)
- CG-002: 철재 제품 (철재, 가이드레일, 케이스, 프레임)
- CG-003: 전기 부품 (모터, 제어기, 센서, 스위치)
- CG-004: 기타 부자재 (볼트, 너트, 와셔, 접착제, 테이프)

#### 품목 마스터 (ItemMaster)
제품 및 부품 정보를 관리합니다.

**샘플 제품:**
- SCREEN-001: 스크린 셔터 기본형 (분류: 스크린)
- SCREEN-002: 스크린 셔터 오픈형 (분류: 오픈사이즈)
- STEEL-001: 철재 셔터 기본형 (분류: 철재)

**샘플 부품:**
- GR-001: 가이드레일 130×80 (분류: 가이드레일)
- CASE-001: 케이스 철재 (분류: 케이스)
- MOTOR-001: 모터 0.4KW (분류: 모터)
- CTL-001: 제어기 기본형 (분류: 제어기)

#### 단가 관리 (PricingData)
품목별 기본 단가 정보를 관리합니다.

**샘플 단가:**
- 가이드레일 130×80: 60,000원
- 케이스 철재: 56,250원
- 모터 0.4KW: 149,500원
- 제어기 기본형: 102,000원

#### 품목 수식 관리 (FormulaRule - BOM 구성)
제품별로 필요한 부품의 수량을 계산하는 수식입니다.

**샘플 수식:**
```javascript
// RULE-BOM-001: 가이드레일 수량 - 스크린
수식: Math.ceil(height / 2438) * 2
설명: 높이 기준으로 가이드레일 필요 개수 계산 (좌우 2개)

// RULE-BOM-002: 케이스 수량 - 스크린
수식: Math.ceil(width / 1000)
설명: 폭 1m당 케이스 1개 필요

// RULE-BOM-003: 모터 수량
수식: 1
설명: 제품 1세트당 모터 1개

// RULE-BOM-004: 제어기 수량
수식: 1
설명: 제품 1세트당 제어기 1개
```

#### 단가 수식 관리 (FormulaRule - 단가 계산)
분류별로 기본 단가에 마진을 적용하는 수식입니다.

**샘플 수식:**
```javascript
// RULE-PRICE-001: 스크린 제품 단가 계산
수식: basePrice * 1.2
설명: 기본 단가에 20% 마진 적용

// RULE-PRICE-002: 철재 제품 단가 계산
수식: basePrice * 1.25
설명: 기본 단가에 25% 마진 적용

// RULE-PRICE-003: 전기 부품 단가 계산
수식: basePrice * 1.15
설명: 기본 단가에 15% 마진 적용
```

### 2. 계산 프로세스

#### Step 1: 제품 선택 및 입력
1. 제품 선택 (예: 스크린 셔터 기본형)
2. 사양 입력
   - 폭 (width): 1200mm
   - 높이 (height): 2400mm
   - 수량 (quantity): 10개

#### Step 2: BOM 구성 (품목 수식 적용)
제품의 분류에 맞는 품목 수식을 찾아 필요한 부품과 수량을 계산합니다.

```
제품: 스크린 셔터 기본형 (분류: 스크린)
입력: width=1200, height=2400

→ 가이드레일: Math.ceil(2400 / 2438) * 2 = 2개
→ 케이스: Math.ceil(1200 / 1000) = 2개
→ 모터: 1개
→ 제어기: 1개
```

#### Step 3: 단가 계산 (단가 수식 적용)
각 품목의 분류에 맞는 단가 수식을 적용하여 최종 단가를 계산합니다.

```
가이드레일 (분류: 가이드레일 → 철재 제품)
- 기본 단가: 60,000원
- 단가 수식: basePrice * 1.25
- 최종 단가: 75,000원
- 수량: 2개
- 합계: 150,000원

케이스 (분류: 케이스 → 철재 제품)
- 기본 단가: 56,250원
- 단가 수식: basePrice * 1.25
- 최종 단가: 70,313원
- 수량: 2개
- 합계: 140,626원

모터 (분류: 모터 → 전기 부품)
- 기본 단가: 149,500원
- 단가 수식: basePrice * 1.15
- 최종 단가: 171,925원
- 수량: 1개
- 합계: 171,925원

제어기 (분류: 제어기 → 전기 부품)
- 기본 단가: 102,000원
- 단가 수식: basePrice * 1.15
- 최종 단가: 117,300원
- 수량: 1개
- 합계: 117,300원

총 금액: 579,851원
```

## 사용 방법

### 1. 메뉴 접근
**기준정보 > 견적 자동 산출**

### 2. 견적 산출
1. 제품 선택 드롭다운에서 제품 선택
2. 폭, 높이, 수량 입력
3. "견적 산출" 버튼 클릭
4. 결과 확인:
   - 품목 목록 및 수량
   - 품목별 단가 및 금액
   - 적용된 수식 정보
   - 총 금액

### 3. 샘플 데이터 사용
- "샘플 데이터" 버튼 클릭
- 자동으로 샘플 제품과 데이터가 로드됨
- 바로 견적 산출 가능

## 시스템 정보

시스템 하단에서 현재 등록된 데이터 현황을 확인할 수 있습니다:
- 등록된 제품 수
- 분류 그룹 수
- 수식 규칙 수
- 단가 데이터 수

## 확장 방법

### 1. 새로운 제품 추가
`기준정보 > 품목관리`에서 새로운 제품 등록
- itemType: 'FG' (완제품)
- itemCategory: 분류 지정

### 2. 새로운 부품 추가
`기준정보 > 품목관리`에서 새로운 부품 등록
- itemType: 'PT' (구매품)
- itemCategory: 분류 지정

### 3. 분류 그룹 추가
`기준정보 > 분류 관리`에서 새로운 분류 그룹 생성
- 관련 카테고리들을 하나의 그룹으로 묶기

### 4. 품목 수식 추가
`기준정보 > 견적수식관리2`에서 BOM 구성 수식 추가
- ruleCode: BOM-으로 시작
- ruleName: 품목 카테고리 포함 (예: "가이드레일 수량")
- outputFormula: 수량 계산 수식

### 5. 단가 수식 추가
`기준정보 > 견적수식관리2`에서 단가 계산 수식 추가
- category: '단가계산'
- ruleName: 분류 그룹명 포함
- outputFormula: basePrice 기반 계산 수식

### 6. 단가 데이터 추가
`기준정보 > 단가관리`에서 품목별 기본 단가 등록
- itemCode와 itemName 정확히 입력
- unitPrice: 기본 단가

## 기술 구조

### 파일 위치
- **메인 컴포넌트**: `/components/QuoteAutoCalculation.tsx`
- **데이터 컨텍스트**: `/components/contexts/DataContext.tsx`
- **메뉴 등록**: `/App.tsx`

### 주요 함수
```typescript
// BOM 구성
applyItemFormulas(product, inputs): BOMItem[]

// 단가 계산
applyPriceFormulas(bomItems): BOMItem[]

// 견적 산출 실행
handleCalculate(): void
```

### 데이터 흐름
```
제품 선택 
  → 분류 확인 
  → BOM 수식 적용 (품목 + 수량)
  → 단가 데이터 조회
  → 단가 수식 적용 (분류별 마진)
  → 최종 금액 계산
```

## 주의사항

1. **품목 코드/이름 일치**: 단가 데이터의 itemCode와 itemName이 품목 마스터와 정확히 일치해야 합니다.

2. **분류 매칭**: 품목의 itemCategory가 분류 그룹의 categories 배열에 포함되어야 단가 수식이 적용됩니다.

3. **수식 변수**: 
   - BOM 수식: width, height, quantity 등 사용
   - 단가 수식: basePrice 필수 사용

4. **수식 안전성**: eval() 사용하므로 수식 입력 시 주의 필요

## 샘플 데이터 초기화

모든 샘플 데이터는 localStorage 버전 관리를 통해 자동으로 로드됩니다:
- categoryGroups: 자동 생성
- itemMasters: 버전 1.1로 샘플 제품/부품 자동 생성
- pricing: 샘플 단가 데이터 포함
- formulaRules: BOM 수식 및 단가 수식 포함

새로고침하면 샘플 데이터가 자동으로 로드되어 바로 테스트 가능합니다.
