Files
sam-docs/projects/mes/price-analysis/README.md
hskwon 4d61f22eb3 feat(mes): 판매관리 기능 분석 문서 추가
- 거래처관리: 목록/상세/등록 UI 분석, API 스펙 정의
- 견적관리: 견적 프로세스 분석, 자동계산 규칙 정의
- 현장관리: 현장 상태 흐름 분석, 진행률 계산 규칙
- 단가관리: 품목유형별 단가 구조 분석, 마진율 계산

포함된 스크린샷: 15개 (거래처 3, 견적 4, 현장 3, 단가 1)
2025-12-18 15:55:52 +09:00

269 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 단가관리 분석 결과
> 분석 일시: 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) |