# 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` - 이전 분석