# 단가관리 분석 결과

> 분석 일시: 2024-12-18
> 분석 대상: design/mes기획서_리액트 (디자인팀 기획 사이트)

## 분석 목적

디자인팀에서 제작한 기획 사이트의 단가관리 기능을 분석하여 API 개발에 필요한 스펙을 추출합니다.

---

## UI 스크린샷

### 1. 단가 목록 페이지
![단가 목록](screenshots/01-price-list.png)

**주요 요소:**

**상단 요약 카드 (4개):**
| 항목 | 값 | 설명 |
|------|-----|------|
| 전체 품목 | 70 | 등록된 총 품목 수 |
| 활성 단가 | 70 | 활성 상태인 단가 수 |
| 거래처그룹 | 4 | 거래처 그룹 수 |
| 품목유형 | 5 | 품목 유형 수 |

**탭 필터 (품목유형별):**
| 탭 | 건수 |
|-----|------|
| 전체 | 70 |
| 제품 | 0 |
| 부품 | 36 |
| 부자재 | 0 |
| 원자재 | 15 |
| 소모품 | 0 |

**테이블 컬럼:**
| 컬럼 | 설명 |
|------|------|
| 번호 | 순번 |
| 품목유형 | 서비스, 원자재, 부품, 반제품 등 |
| 품목코드 | 품목 식별 코드 |
| 품목명 | 품목 이름 |
| 규격 | 규격 정보 |
| 단위 | EA, SET, KG, M 등 |
| 매입단가 | 구매 단가 |
| 가공비 | 가공 비용 |
| LOSS(%) | 손실률 |
| 판매단가 | 판매 가격 |
| 마진율 | (판매단가-매입단가)/판매단가 * 100 |
| 적용일 | 단가 적용 시작일 |
| 상태 | 활성/비활성 |

---

## 데이터 분석 (캡처된 품목 기준)

### 품목유형별 분포

| 품목유형 | 건수 | 주요 품목 |
|----------|------|-----------|
| 서비스 | 1 | 검사비 |
| 원자재 | 15 | 하부BASE, 상부덮개, 마구리, 평철, 엘바, 하장바, 각파이프, 조인트바, 환봉 |
| 부품 | 36 | 받침용앵글, 브라켓, 감기샤프트, 연동제어기, 전동개폐기 |
| 반제품 | 18 | 연기차단재, 하단마감재, 케이스, 가이드레일 |

### 대표 품목 예시

**원자재:**
| 품목코드 | 품목명 | 규격 | 단위 | 매입단가 | 판매단가 | 마진율 |
|----------|--------|------|------|----------|----------|--------|
| 하부BASE-코너형 | 하부BASE(코너형) | - | SET | 30,000 | 45,000 | 50% |
| 각파이프-30×30L6000 | 각파이프 30×30 L:6000 | 30×30 | EA | 15,000 | 22,500 | 50% |

**부품:**
| 품목코드 | 품목명 | 규격 | 단위 | 매입단가 | 판매단가 | 마진율 |
|----------|--------|------|------|----------|----------|--------|
| 전동개폐기-220V300KG유선 | 전동개폐기 300KG 220V 유선 | 300 | EA | 350,000 | 480,000 | 37% |
| 감기샤프트-76.3×2.8TL3000 | 감기샤프트 76.3×2.8T L:3000 | 76 | EA | 55,000 | 80,000 | 45% |

**반제품:**
| 품목코드 | 품목명 | 규격 | 단위 | 매입단가 | 판매단가 | 마진율 |
|----------|--------|------|------|----------|----------|--------|
| RC30 | 가이드레일(벽면형) C형 3000 | 3000 | EA | 18,000 | 27,000 | 50% |
| CB30 | 케이스(후면코너부) 3000 | 3000 | EA | 20,000 | 30,000 | 50% |

---

## 데이터 스키마

### Price (단가)
```
prices
├── id (PK)
├── tenant_id (FK)
├── item_type - 품목유형 (제품, 부품, 부자재, 원자재, 소모품, 서비스, 반제품)
├── item_code (UNIQUE) - 품목코드
├── item_name - 품목명
├── specification - 규격
├── unit - 단위 (EA, SET, KG, M, ㎡ 등)
├── purchase_price - 매입단가
├── processing_cost - 가공비
├── loss_rate - 손실률 (%)
├── selling_price - 판매단가
├── margin_rate - 마진율 (%) - 자동계산
├── effective_date - 적용일
├── status - 상태 (활성/비활성)
├── customer_group_id - 거래처그룹 (특별단가용)
├── note - 비고
├── created_at
├── updated_at
└── deleted_at
```

### PriceHistory (단가 변경이력)
```
price_histories
├── id (PK)
├── price_id (FK)
├── previous_purchase_price
├── previous_selling_price
├── new_purchase_price
├── new_selling_price
├── changed_by
├── changed_at
└── reason - 변경사유
```

---

## 품목유형 (item_type)

| 유형 | 설명 | 예시 |
|------|------|------|
| 제품 | 완성품 | 방화스크린셔터, 방화슬랫셔터 |
| 부품 | 조립 부품 | 전동개폐기, 감기샤프트, 브라켓 |
| 반제품 | 중간 가공품 | 가이드레일, 케이스, 하단마감재 |
| 원자재 | 원재료 | 철판, 파이프, 볼트 |
| 부자재 | 보조재료 | 나사, 패킹, 접착제 |
| 소모품 | 소모성 재료 | 장갑, 테이프, 라벨 |
| 서비스 | 용역 | 검사비, 운송비, 설치비 |

---

## 단위 코드

| 단위 | 설명 | 사용 품목 |
|------|------|-----------|
| EA | 개 | 개별 품목 |
| SET | 세트 | 세트 품목 |
| KG | 킬로그램 | 중량 기준 |
| M | 미터 | 길이 기준 |
| ㎡ | 제곱미터 | 면적 기준 |
| BOX | 박스 | 박스 단위 |

---

## 자동 계산

### 마진율 계산
```javascript
margin_rate = ((selling_price - purchase_price) / selling_price) * 100

// 가공비와 손실률 포함 시
total_cost = purchase_price + processing_cost
adjusted_cost = total_cost * (1 + loss_rate / 100)
margin_rate = ((selling_price - adjusted_cost) / selling_price) * 100
```

### 손실률 적용
```javascript
// 실제 필요량 계산
required_qty = order_qty * (1 + loss_rate / 100)

// 예: 100개 주문, 손실률 5%
// required_qty = 100 * 1.05 = 105개
```

---

## API 스펙

### 단가 CRUD

```
GET    /api/prices                   - 단가 목록
GET    /api/prices/{id}              - 단가 상세
POST   /api/prices                   - 단가 등록
PUT    /api/prices/{id}              - 단가 수정
DELETE /api/prices/{id}              - 단가 삭제
DELETE /api/prices                   - 단가 일괄 삭제
```

### 단가 조회 (견적/수주용)

```
GET    /api/prices/lookup            - 품목코드로 단가 조회
```

**Query Parameters:**
| 파라미터 | 타입 | 설명 |
|----------|------|------|
| item_code | string | 품목코드 |
| customer_group_id | number | 거래처그룹 (특별단가 적용) |

### 단가 이력

```
GET    /api/prices/{id}/history      - 단가 변경 이력
```

### 목록 조회 Query Parameters

| 파라미터 | 타입 | 설명 |
|----------|------|------|
| item_type | string | 품목유형 필터 |
| status | string | 상태 필터 |
| search | string | 검색어 (품목코드, 품목명, 규격) |
| page | number | 페이지 번호 |
| per_page | number | 페이지당 개수 |

---

## 거래처그룹 단가

```
customer_group_prices
├── id (PK)
├── price_id (FK)
├── customer_group_id (FK)
├── special_price - 특별단가
├── discount_rate - 할인율 (%)
├── effective_from - 적용 시작일
├── effective_to - 적용 종료일
├── status
└── created_at
```

**특별단가 적용 우선순위:**
1. 거래처별 특별단가
2. 거래처그룹 특별단가
3. 기본 판매단가

---

## 품목코드 규칙

```
{품목명약어}-{규격}

예시:
- 전동개폐기-220V300KG유선
- 감기샤프트-76.3×2.8TL3000
- RC30 (가이드레일 C형 3000)
- CB30 (케이스 후면코너부 3000)
```

---

## 통계 정보

| 항목 | 계산식 |
|------|--------|
| 전체 품목 | COUNT(*) |
| 활성 단가 | COUNT(*) WHERE status = '활성' |
| 거래처그룹 | COUNT(DISTINCT customer_group_id) |
| 품목유형 | COUNT(DISTINCT item_type) |
| 평균 마진율 | AVG(margin_rate) |
