# 영업 / 수주 / 견적 도메인

> **모델 수**: Orders 8 + Quote 8 + Estimate 2 = 18
> **핵심**: 견적 → 수주 → 생산 변환 흐름

---

## 주요 테이블

### 수주 (Orders)

| 테이블 | 모델 | 역할 |
|--------|------|------|
| orders | Order | 수주 마스터 (status: DRAFT→CONFIRMED→IN_PRODUCTION) |
| order_items | OrderItem | 수주 항목 (options JSON 포함) |
| order_nodes | OrderNode | 설계 분해 구조 |
| order_item_components | OrderItemComponent | 수주 항목 구성요소 |
| order_histories | OrderHistory | 수주 변경 이력 |
| clients | Client | 거래처 마스터 |
| client_groups | ClientGroup | 거래처 그룹 |
| site_briefings | SiteBriefing | 현장 브리핑 |

### 견적 (Quote)

| 테이블 | 모델 | 역할 |
|--------|------|------|
| quotes | Quote | 견적 마스터 |
| quote_items | QuoteItem | 견적 항목 |
| quote_formulas | QuoteFormula | 견적 공식 |
| quote_formula_categories | QuoteFormulaCategory | 공식 카테고리 |
| quote_revisions | QuoteRevision | 견적 버전 이력 |

### 견적서 (Estimate)

| 테이블 | 모델 | 역할 |
|--------|------|------|
| estimates | Estimate | 견적서 마스터 |
| estimate_items | EstimateItem | 견적서 항목 |

---

## 관계 구조

```
Quote (견적)
  ├─ belongsTo Client
  ├─ belongsTo SiteBriefing
  ├─ belongsTo Item
  ├─ hasMany QuoteItem
  ├─ hasMany QuoteRevision
  └─ → Order 변환 (OrderService)

Order (수주)
  ├─ belongsTo Quote
  ├─ belongsTo Client
  ├─ hasMany OrderItem
  │   ├─ belongsTo Item
  │   ├─ hasMany OrderItemComponent
  │   └─ options: JSON { floor, code, width, height, cutting_info, slat_info, bending_info }
  ├─ hasMany OrderNode
  ├─ hasMany OrderHistory
  └─ hasMany WorkOrder (생산으로 변환)
```

---

## 비즈니스 흐름

```
견적(Quote) → 수주(Order) → 작업지시(WorkOrder) → 작업실적(WorkResult)
     │              │              │
  QuoteItem    OrderItem    WorkOrderItem
```

### 상태 흐름 (Order)
```
DRAFT → CONFIRMED → IN_PRODUCTION → COMPLETED → SHIPPED
```

---

## OrderItem options JSON 구조

```json
{
  "floor": "1F",
  "code": "SL-001",
  "width": 1200,
  "height": 800,
  "cutting_info": { ... },
  "slat_info": { "joint_bar": 2, "glass_qty": 10 },
  "bending_info": { ... },
  "wip_info": { ... }
}
```

- 견적 → 수주 변환 시 `extractSlatInfoFromBom()`으로 slat_info 자동 계산
- 조인트바 수량 공식: `(2 + floor((제작가로 - 500) / 1000)) × 셔터수량`