# 품목/모델 (Product/Model) 분석

## 개요
- **디렉토리**: `/models/`
- **DB 테이블**: `models`, `parts`, `parts_sub`
- **주요 기능**: 제품 모델 정의, BOM(Bill of Materials) 관리, 단가 계산

## 디렉토리 구조
```
/models/
├── _request.php           # 요청 파라미터
├── _row.php               # 행 렌더링
├── _part_row.php          # 부품 행 렌더링
├── _part_sub_row.php      # 하위 부품 행 렌더링
├── insert.php             # 모델/부품 저장
├── list.php               # 모델 목록
├── write_form.php         # 모델 등록/수정 폼
├── modelslist.php         # 모델 리스트 조회
├── itemlist.php           # 아이템 리스트
├── sub_table.php          # 하위 부품 테이블
├── basic_model.php        # 기본 모델 설정
├── models.json            # 모델 JSON 데이터
└── items.json             # 아이템 JSON 데이터
```

## DB 스키마

### 1. models 테이블 (모델 마스터)
```sql
CREATE TABLE models (
    model_id INT AUTO_INCREMENT PRIMARY KEY,
    model_name VARCHAR(100),           -- 모델명
    major_category VARCHAR(50),        -- 대분류 (슬랫, 스크린 등)
    finishing_type VARCHAR(50),        -- 마감 유형
    description TEXT,                  -- 설명
    guiderail_type VARCHAR(50),        -- 가이드레일 유형
    update_log TEXT,                   -- 수정이력
    is_deleted TINYINT DEFAULT 0,      -- 삭제플래그

    INDEX idx_model_name (model_name),
    INDEX idx_major_category (major_category)
);
```

### 2. parts 테이블 (부품 - 2단계)
```sql
CREATE TABLE parts (
    part_id INT AUTO_INCREMENT PRIMARY KEY,
    model_id INT,                      -- 부모 모델 ID
    part_name VARCHAR(100),            -- 부품명
    spec VARCHAR(100),                 -- 규격
    unit VARCHAR(20),                  -- 단위
    quantity DECIMAL(10,2),            -- 수량
    unitprice DECIMAL(15,0),           -- 단가
    memo TEXT,                         -- 메모
    is_deleted TINYINT DEFAULT 0,      -- 삭제플래그

    FOREIGN KEY (model_id) REFERENCES models(model_id),
    INDEX idx_model_id (model_id)
);
```

### 3. parts_sub 테이블 (하위 부품 - 3단계)
```sql
CREATE TABLE parts_sub (
    subpart_id INT AUTO_INCREMENT PRIMARY KEY,
    part_id INT,                       -- 부모 부품 ID
    subpart_name VARCHAR(100),         -- 하위 부품명
    material VARCHAR(100),             -- 소재

    -- 가격 계산 필드
    bendSum DECIMAL(15,0),             -- 벤딩 합계
    plateSum DECIMAL(15,0),            -- 판재 합계
    finalSum DECIMAL(15,0),            -- 최종 합계
    unitPrice DECIMAL(15,0),           -- 단가
    computedPrice DECIMAL(15,0),       -- 계산 가격
    quantity DECIMAL(10,2),            -- 수량
    lineTotal DECIMAL(15,0),           -- 행 합계

    image_url VARCHAR(500),            -- 이미지 URL
    is_deleted TINYINT DEFAULT 0,      -- 삭제플래그

    FOREIGN KEY (part_id) REFERENCES parts(part_id),
    INDEX idx_part_id (part_id)
);
```

## 계층 구조

```
models (모델)
└── parts (부품)
    └── parts_sub (하위 부품)

예시:
├── KD-SLAT-001 (슬랫 모델)
│   ├── 가이드레일 (부품)
│   │   ├── 상부 브라켓 (하위 부품)
│   │   ├── 하부 브라켓 (하위 부품)
│   │   └── 레일 바디 (하위 부품)
│   ├── 슬랫 본체 (부품)
│   │   ├── 슬랫 코일 (하위 부품)
│   │   └── 인터락 (하위 부품)
│   └── 구동부 (부품)
│       ├── 모터 (하위 부품)
│       └── 샤프트 (하위 부품)
```

## 비즈니스 로직

### 모델 관리 (insert.php)
```php
// 1단계: 모델 저장
if ($mode == "insert") {
    $sql = "INSERT INTO models (model_name, major_category, finishing_type,
            description, update_log, guiderail_type) VALUES (?, ?, ?, ?, ?, ?)";
}

// 2단계: 부품 저장 (배열 처리)
if(isset($_POST['part_name']) && is_array($_POST['part_name'])) {
    // 기존 부품과 비교하여 삭제된 부품 처리
    // 신규 부품 INSERT, 기존 부품 UPDATE
}

// 3단계: 하위 부품 저장
if(isset($_POST['subpart_name']) && is_array($_POST['subpart_name'])) {
    // parent_part_id로 부모 부품과 연결
}
```

### 복사 기능
```php
// 모델 복사 시 하위 구조 전체 복사
if ($mode == "copy") {
    // 1. 모델 복사 → 새 model_id
    // 2. 부품 복사 → partMapping (old_id → new_id)
    // 3. 하위 부품 복사 → partMapping 기반 parent_id 변환
}
```

### 가격 계산
- `bendSum`: 벤딩 공정 비용 합계
- `plateSum`: 판재 비용 합계
- `finalSum`: bendSum + plateSum
- `computedPrice`: 추가 가공비 포함
- `lineTotal`: unitPrice × quantity

## 관련 JSON 데이터

### models.json
```json
[
    {
        "model_name": "KD-SLAT-001",
        "slatitem": "슬랫",
        "pair": "single"
    },
    {
        "model_name": "KD-SCREEN-001",
        "slatitem": "스크린",
        "pair": "double"
    }
]
```

### items.json
```json
[
    {
        "item_code": "ITM001",
        "item_name": "가이드레일 A형",
        "category": "가이드레일"
    }
]
```

## 관련 디렉토리

### 단가 관리 디렉토리
```
/price_angle/        # 앵글 단가
/price_bend/         # 벤딩 단가
/price_motor/        # 모터 단가
/price_pipe/         # 파이프 단가
/price_pole/         # 폴 단가
/price_raw_materials/ # 원자재 단가
/price_screenplate/  # 스크린판 단가
/price_shaft/        # 샤프트 단가
/price_smokeban/     # 연기차단 단가
```

### 벤딩/가공 관련
```
/bending/            # 벤딩 작업
/bendingfee/         # 벤딩 비용
/bendingmap/         # 벤딩 맵
/etcbending/         # 기타 벤딩
```

## SAM 마이그레이션 포인트

### 1. BOM 구조 개선
```sql
-- SAM: 재귀적 BOM 구조
bom_items (
    id,
    tenant_id,
    parent_id,           -- NULL이면 최상위 모델
    item_type,           -- model, assembly, part, material
    item_code,
    item_name,
    quantity,
    unit_price,
    level,               -- BOM 레벨 (1, 2, 3, ...)
    sort_order
)
```

### 2. 가격 계산 분리
```sql
-- SAM: 가격 계산 이력 관리
price_calculations (
    id,
    bom_item_id,
    calculation_type,    -- bending, material, labor
    base_price,
    markup_rate,
    final_price,
    effective_from,
    effective_to
)
```

### 3. 버전 관리
```sql
-- SAM: 모델 버전 관리
model_versions (
    id,
    model_id,
    version,
    snapshot JSON,       -- BOM 스냅샷
    created_at,
    created_by
)
```

## 참고 파일
- `/models/insert.php` - 3단계 계층 저장 로직
- `/models/write_form.php` - BOM 편집 UI
- `/common.php:selectModel()` - 모델 선택 헬퍼 함수
