Files
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

15 KiB
Raw Permalink Blame History

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 테이블 (견적 마스터)

스키마

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)

[
    {
        "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)

[
    {
        "item_code": "AUTO001",
        "item_name": "벤딩 가공비",
        "calc_type": "per_meter",
        "base_value": 120.5,
        "unit_price": 2500,
        "amount": 301250
    }
]

3. BDmodels 테이블 (모델별 단가)

스키마

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 구조

{
    "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 (주자재)

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 (모터)

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 (샤프트)

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 (각파이프)

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 (앵글)

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 스키마 (제안)

-- 견적 헤더
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 - 이전 분석