Files
sam-docs/projects/quotation/phase-1-5130-analysis/db-structure.md
hskwon 1066ea25b2 docs: Phase 5 API 문서 추가 (사용자 초대, 알림설정, 계정관리)
- erp-api-list.md: Phase 5 섹션 추가 (12개 API)
- erp-api-detail.md: Phase 5 상세 스펙 추가
  - 13. 사용자 초대 (5개): 목록, 발송, 수락, 취소, 재발송
  - 14. 알림 설정 (3개): 조회, 수정, 일괄수정
  - 15. 계정 관리 (4개): 탈퇴, 사용중지, 약관조회, 약관수정
2025-12-19 15:35:41 +09:00

448 lines
15 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.

# DB 구조 분석
> **분석 대상:** 5130 레거시 견적 시스템 데이터베이스
> **데이터베이스:** chandj
> **분석 일자:** 2025-12-19
---
## 테이블 목록
### 핵심 테이블
| 테이블명 | 용도 | 비고 |
|----------|------|------|
| `estimate` | 견적서 마스터 | 견적 헤더 + JSON 상세 |
| `BDmodels` | 모델별 단가 | 케이스, 레일, 부자재 단가 |
| `BDparts` | 부품 단가 | 부품별 가격 계수 |
### 단가 테이블
| 테이블명 | 용도 | 비고 |
|----------|------|------|
| `price_raw_materials` | 주자재 단가 | 스크린, 슬랫 소재 |
| `price_motor` | 모터 단가 | 용량별 모터 가격 |
| `price_shaft` | 샤프트 단가 | 길이별 샤프트 가격 |
| `price_pipe` | 각파이프 단가 | 규격별 파이프 가격 |
| `price_angle` | 앵글 단가 | 규격별 앵글 가격 |
| `price_bend` | 절곡비 단가 | 절곡 가공비 |
| `price_smokeban` | 연기차단재 단가 | 연기차단재 가격 |
| `price_etc` | 기타 단가 | 기타 부자재 |
| `price_pole` | 폴 단가 | 폴 관련 가격 |
### 참조 테이블
| 테이블명 | 용도 |
|----------|------|
| `item_list` | 품목 마스터 |
| `output` | 발주서 (수주→발주 연계) |
---
## 1. estimate 테이블 (견적 마스터)
### 스키마
```sql
CREATE TABLE estimate (
num INT AUTO_INCREMENT PRIMARY KEY,
-- 기본 정보
pjnum VARCHAR(50), -- 프로젝트 번호 (KD-PR-YYMMDD-NN)
indate DATE, -- 등록일
orderman VARCHAR(50), -- 담당자
outworkplace VARCHAR(200), -- 현장명/거래처
-- 분류 정보
major_category VARCHAR(50), -- 대분류 (스크린/철재)
model_name VARCHAR(100), -- 모델명 (KSS01, KFS01 등)
position VARCHAR(50), -- 위치
-- 규격 정보
makeWidth INT DEFAULT 160, -- 제작 폭 (스크린:160, 슬랫:110)
makeHeight INT DEFAULT 350, -- 제작 높이
maguriWing VARCHAR(20) DEFAULT '50', -- 마구리 윙
-- 발주처 정보
con_num VARCHAR(50), -- 계약번호
secondord VARCHAR(100), -- 2차 발주처
secondordman VARCHAR(50), -- 2차 담당자
secondordmantel VARCHAR(20), -- 2차 담당자 연락처
secondordnum VARCHAR(50), -- 2차 발주번호
-- 견적 상세 (JSON)
estimateList TEXT, -- 스크린 견적 리스트 (JSON)
estimateList_auto TEXT, -- 스크린 자동계산 리스트 (JSON)
estimateSlatList TEXT, -- 슬랫 견적 리스트 (JSON)
estimateSlatList_auto TEXT, -- 슬랫 자동계산 리스트 (JSON)
-- 금액 정보
estimateTotal INT DEFAULT 0, -- 견적 총액
EstimateFirstSum INT DEFAULT 0, -- 최초 견적 합계
EstimateUpdatetSum INT DEFAULT 0, -- 수정 견적 합계
EstimateDiffer INT DEFAULT 0, -- 차액
estimateSurang INT DEFAULT 0, -- 수량
-- 할인 정보
EstimateDiscountRate INT DEFAULT 0,-- 할인율 (%)
EstimateDiscount INT DEFAULT 0, -- 할인금액
EstimateFinalSum INT DEFAULT 0, -- 최종 금액
-- 검사비/옵션
inspectionFee INT DEFAULT 50000, -- 인정검사비
steel VARCHAR(50), -- 절곡 옵션 (1/0)
motor VARCHAR(100), -- 모터 옵션 (1/0)
warranty VARCHAR(100), -- 보증 (인정/빈값)
slatcheck VARCHAR(10), -- 슬랫 체크 (1/0)
partscheck VARCHAR(10), -- 부자재 체크 (1/0)
-- 시스템 필드
comment TEXT, -- 비고
update_log TEXT, -- 수정이력
is_deleted TINYINT DEFAULT 0, -- 삭제플래그
INDEX idx_pjnum (pjnum),
INDEX idx_outworkplace (outworkplace),
INDEX idx_indate (indate)
);
```
### 주요 컬럼 설명
#### 프로젝트 번호 (pjnum)
```
형식: KD-PR-YYMMDD-NN
- KD: 경동
- PR: 프로젝트
- YYMMDD: 날짜 (6자리)
- NN: 일련번호 (01~99)
예시: KD-PR-251219-01
```
#### 대분류 (major_category)
| 값 | 설명 |
|----|------|
| 스크린 | 스크린 방화셔터 |
| 철재 | 철재 슬랫 방화셔터 |
#### 체크박스 옵션
| 컬럼 | 값 | 의미 |
|------|-----|------|
| steel | '1' / '0' | 절곡 포함/미포함 |
| motor | '1' / '0' | 모터 포함/미포함 |
| warranty | '인정' / '' | 보증 포함/미포함 |
| slatcheck | '1' / '0' | 슬랫 포함/미포함 |
| partscheck | '1' / '0' | 부자재 포함/미포함 |
---
## 2. estimateList JSON 구조
### 수동 입력 항목 (estimateList, estimateSlatList)
```json
[
{
"item_name": "가이드레일",
"specification": "A형 65×80",
"unit": "EA",
"quantity": 2,
"unit_price": 150000,
"amount": 300000,
"remark": ""
},
{
"item_name": "스크린 판넬",
"specification": "1.0T × 1200W",
"unit": "m²",
"quantity": 24.5,
"unit_price": 45000,
"amount": 1102500,
"remark": "SUS304"
}
]
```
### 자동 계산 항목 (estimateList_auto, estimateSlatList_auto)
```json
[
{
"item_code": "AUTO001",
"item_name": "벤딩 가공비",
"calc_type": "per_meter",
"base_value": 120.5,
"unit_price": 2500,
"amount": 301250
}
]
```
---
## 3. BDmodels 테이블 (모델별 단가)
### 스키마
```sql
CREATE TABLE IF NOT EXISTS BDmodels (
id INT AUTO_INCREMENT PRIMARY KEY,
modelname VARCHAR(50), -- 모델명
itemname VARCHAR(100), -- 품목명
itemsecond VARCHAR(100), -- 품목 세부
itemList TEXT, -- 상세 가격 JSON
is_deleted TINYINT DEFAULT 0,
INDEX idx_modelname (modelname),
INDEX idx_itemname (itemname)
);
```
### itemList JSON 구조
```json
{
"prices": [
{"size": "530*320", "price": 150000},
{"size": "600*350", "price": 180000},
{"size": "690*390", "price": 210000}
],
"unit": "EA",
"description": "모터 브라켓"
}
```
### 주요 품목
| modelname | itemname | 용도 |
|-----------|----------|------|
| 공통 | 케이스 | 케이스 단가 |
| 공통 | 가이드레일 | 레일 단가 |
| 공통 | 연기차단재 | 연기차단재 단가 |
| 공통 | 하장바 | 하장바 단가 |
| 공통 | 마구리 | 마구리 단가 |
| 스크린 | L바 | L바 단가 (스크린 전용) |
| 스크린 | 보강평철 | 보강평철 단가 (스크린 전용) |
| 슬랫 | 조인트바 | 조인트바 단가 (슬랫 전용) |
---
## 4. 단가 테이블
### price_raw_materials (주자재)
```sql
CREATE TABLE price_raw_materials (
id INT AUTO_INCREMENT PRIMARY KEY,
material_type VARCHAR(50), -- 소재 유형 (실리카, 와이어, 방화슬랫)
specification VARCHAR(100), -- 규격
unit VARCHAR(20), -- 단위 (m², kg)
unit_price DECIMAL(10,0), -- 단가
itemList TEXT, -- 상세 JSON
is_deleted TINYINT DEFAULT 0
);
```
### price_motor (모터)
```sql
CREATE TABLE price_motor (
id INT AUTO_INCREMENT PRIMARY KEY,
capacity VARCHAR(20), -- 용량 (150K, 300K, 500K, 800K, 1000K)
type VARCHAR(50), -- 유형
unit_price DECIMAL(10,0), -- 단가
is_deleted TINYINT DEFAULT 0
);
```
### price_shaft (샤프트)
```sql
CREATE TABLE price_shaft (
id INT AUTO_INCREMENT PRIMARY KEY,
length_range VARCHAR(50), -- 길이 범위
unit_price DECIMAL(10,0), -- 단가
weight_per_meter DECIMAL(5,2), -- m당 중량
is_deleted TINYINT DEFAULT 0
);
```
### price_pipe (각파이프)
```sql
CREATE TABLE price_pipe (
id INT AUTO_INCREMENT PRIMARY KEY,
specification VARCHAR(50), -- 규격 (50×50, 75×75 등)
unit_price DECIMAL(10,0), -- m당 단가
weight_per_meter DECIMAL(5,2), -- m당 중량
is_deleted TINYINT DEFAULT 0
);
```
### price_angle (앵글)
```sql
CREATE TABLE price_angle (
id INT AUTO_INCREMENT PRIMARY KEY,
specification VARCHAR(50), -- 규격 (50×50×5 등)
unit_price DECIMAL(10,0), -- m당 단가
weight_per_meter DECIMAL(5,2), -- m당 중량
is_deleted TINYINT DEFAULT 0
);
```
---
## 5. 컬럼 매핑 (스크린 vs 슬랫)
### get_screen_amount.php 컬럼
| 항목 | 컬럼 | 설명 |
|------|------|------|
| 위치 | col1 | 설치 위치 |
| 폭 | col2 | 오픈사이즈 폭 (mm) |
| 높이 | col3 | 오픈사이즈 높이 (mm) |
| 수량 | col4 | 수량 |
| 소재 | col5 | 실리카/와이어 |
| 케이스 타입 | col6 | 절곡/롤 |
| 레일 타입 | col7 | A형/B형 |
| 설치방식 | col8 | 매립/노출 |
| 면적 | col9 | 계산된 면적 (m²) |
| 케이스 길이 | col10 | mm |
| 레일 길이 | col11 | mm |
| 하장바 길이 | col12 | mm |
| 중량 | col13 | kg |
| 검사비 | col14 | 원 |
| 주자재 | col15 | 원 |
| 모터 | col16 | 원 |
| 제어기 | col17 | 원 |
| 케이스 | col18 | 원 |
| 레일 | col19 | 원 |
| 앵글 | col20 | 원 |
| 샤프트 | col21 | 원 |
| 인치 | col22 | 샤프트 인치 |
### get_slat_amount.php 컬럼
| 항목 | 컬럼 | 설명 |
|------|------|------|
| 위치 | col1 | 설치 위치 |
| 폭 | col2 | 오픈사이즈 폭 (mm) |
| 높이 | col3 | 오픈사이즈 높이 (mm) |
| 수량 | col4 | 수량 |
| 소재 | col5 | 방화슬랫 |
| 케이스 타입 | col6 | 절곡/롤 |
| 레일 타입 | col7 | A형/B형 |
| 설치방식 | col8 | 매립/노출 |
| 면적 | col9 | 계산된 면적 (m²) |
| 케이스 길이 | col10 | mm |
| 레일 길이 | col11 | mm |
| 하장바 길이 | col12 | mm |
| 중량 | col13 | kg |
| 검사비 | col14 | 원 |
| 주자재 (슬랫) | col15 | 원 |
| 조인트바 | col16 | 원 (슬랫 전용) |
| 모터 | col17 | 원 |
| 제어기 | col18 | 원 |
| 케이스 | col19 | 원 |
| 레일 | col20 | 원 |
| 앵글 | col21 | 원 |
| 샤프트 | col22 | 원 |
| 인치 | col23 | 샤프트 인치 |
---
## 6. 데이터 관계도
```
┌─────────────────────────────────────────────────────────┐
│ estimate │
│ (견적 마스터) │
├─────────────────────────────────────────────────────────┤
│ num (PK) │
│ pjnum (견적번호) │
│ major_category → '스크린' / '철재' │
│ model_name → item_list.model_name │
│ estimateList (JSON) ────┐ │
│ estimateSlatList (JSON) │ │
└──────────────────────────┼───────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ JSON 상세 항목 │
├─────────────────────────────────────────────────────────┤
│ item_name → BDmodels.itemname │
│ unit_price ← price_* 테이블 조회 │
└──────────────────────────────────────────────────────────┘
┌─────────────────┼─────────────────┐
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ BDmodels │ │ price_motor │ │ price_shaft │
│ (모델 단가) │ │ (모터 단가) │ │ (샤프트 단가)│
└──────────────┘ └──────────────┘ └──────────────┘
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│price_raw_mat │ │ price_pipe │ │ price_angle │
│ (주자재) │ │ (각파이프) │ │ (앵글) │
└──────────────┘ └──────────────┘ └──────────────┘
```
---
## 7. SAM 이관 매핑
### 테이블 매핑
| 5130 테이블 | SAM 테이블 | 비고 |
|-------------|------------|------|
| estimate | quotes + quote_items | 헤더/상세 분리 |
| BDmodels | products + prices | 품목기준관리 연동 |
| price_* | prices | 통합 단가 테이블 |
### 주요 변환 포인트
1. **JSON → 정규화**: estimateList JSON을 quote_items 테이블로 분리
2. **동적 컬럼 → 고정 컬럼**: col1~col23을 명시적 컬럼명으로 변경
3. **체크박스 → options JSON**: steel, motor 등을 options JSON으로 통합
4. **단가 테이블 통합**: 7개 단가 테이블을 prices 테이블로 통합
### SAM 스키마 (제안)
```sql
-- 견적 헤더
CREATE TABLE quotes (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
tenant_id BIGINT UNSIGNED NOT NULL,
quote_number VARCHAR(50) NOT NULL,
quote_date DATE NOT NULL,
customer_id BIGINT UNSIGNED,
project_name VARCHAR(200),
category ENUM('screen', 'slat') NOT NULL,
model_id BIGINT UNSIGNED,
options JSON, -- {steel: true, motor: true, warranty: true, ...}
dimensions JSON, -- {width: 160, height: 350, wing: 50}
inspection_fee DECIMAL(10,0) DEFAULT 50000,
subtotal DECIMAL(12,0) DEFAULT 0,
discount_rate DECIMAL(5,2) DEFAULT 0,
discount_amount DECIMAL(12,0) DEFAULT 0,
total_amount DECIMAL(12,0) DEFAULT 0,
status ENUM('draft', 'sent', 'accepted', 'rejected') DEFAULT 'draft',
created_by BIGINT UNSIGNED,
created_at TIMESTAMP,
updated_at TIMESTAMP,
deleted_at TIMESTAMP NULL,
INDEX idx_tenant_quote (tenant_id, quote_number),
INDEX idx_tenant_date (tenant_id, quote_date)
);
-- 견적 상세
CREATE TABLE quote_items (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
quote_id BIGINT UNSIGNED NOT NULL,
item_type ENUM('manual', 'auto') DEFAULT 'manual',
item_code VARCHAR(50),
item_name VARCHAR(100) NOT NULL,
specification VARCHAR(200),
unit VARCHAR(20),
quantity DECIMAL(10,2) DEFAULT 1,
unit_price DECIMAL(12,0) DEFAULT 0,
amount DECIMAL(12,0) DEFAULT 0,
sort_order INT DEFAULT 0,
remark TEXT,
FOREIGN KEY (quote_id) REFERENCES quotes(id) ON DELETE CASCADE,
INDEX idx_quote (quote_id)
);
```
---
## 참조 파일
- `5130/estimate/insert.php` - 견적 저장 로직
- `5130/estimate/fetch_unitprice.php` - 단가 조회
- `5130/bendingfee_backup/sql.php` - BDmodels 스키마
- `docs/projects/legacy-5130/03_ESTIMATE.md` - 이전 분석