# Phase 3 테이블 매핑 > **구현일:** 2025-12-19 > **정책 참조:** [PROJECT_DEVELOPMENT_POLICY.md](../../guides/PROJECT_DEVELOPMENT_POLICY.md) --- ## 1. 단가 테이블 매핑 ### 5130 테이블 → SAM 테이블 | 5130 테이블 | SAM 테이블 | 상태 | 비고 | |------------|-----------|------|------| | `price_screen` | `prices` | ✅ 통합 | item_type_code='PRODUCT' | | `price_slat` | `prices` | ✅ 통합 | item_type_code='PRODUCT' | | `price_motor` | `prices` | ✅ 통합 | item_type_code='PRODUCT' | | `price_controller` | `prices` | ✅ 통합 | item_type_code='PRODUCT' | | `price_parts` | `prices` | ✅ 통합 | item_type_code='MATERIAL' | ### prices 테이블 구조 ```sql CREATE TABLE prices ( id BIGINT PRIMARY KEY, tenant_id BIGINT NOT NULL, -- 품목 연결 (5130 분산 → SAM 통합) item_type_code VARCHAR(20) NOT NULL, -- 'PRODUCT' / 'MATERIAL' item_id BIGINT NOT NULL, -- products.id 또는 materials.id client_group_id BIGINT NULL, -- 고객그룹별 단가 (NULL=기본가) -- 원가 정보 purchase_price DECIMAL(15,4), -- 매입단가 processing_cost DECIMAL(15,4), -- 가공비 loss_rate DECIMAL(5,2), -- LOSS율 (%) -- 판매가 정보 margin_rate DECIMAL(5,2), -- 마진율 (%) sales_price DECIMAL(15,4), -- 판매단가 (★ 견적에서 사용) -- 적용 기간 effective_from DATE NOT NULL, effective_to DATE NULL, -- 상태 status ENUM('draft','active','inactive','finalized'), -- 감사 created_at, updated_at, deleted_at ); ``` --- ## 2. 수식 테이블 매핑 ### 5130 → SAM 구조 비교 | 5130 | SAM | 비고 | |------|-----|------| | JS 하드코딩 | `quote_formula_categories` | 카테고리 분류 | | JS 하드코딩 | `quote_formulas` | 수식 정의 | | PHP 함수 | `quote_formula_ranges` | 범위별 조건 | | PHP 조건문 | `quote_formula_mappings` | 매핑 조건 | | - | `quote_formula_items` | 품목 출력 | ### quote_formulas 테이블 구조 ```sql CREATE TABLE quote_formulas ( id BIGINT PRIMARY KEY, tenant_id BIGINT NOT NULL, category_id BIGINT NOT NULL, -- FK: quote_formula_categories product_id BIGINT NULL, -- 특정 제품용 (NULL=공통) -- 수식 정보 name VARCHAR(200) NOT NULL, variable VARCHAR(50) NOT NULL, -- 변수명 (W0, H0, M, K 등) type ENUM('input','calculation','range','mapping'), formula TEXT NULL, -- 계산식 output_type ENUM('variable','item'), -- 결과 유형 -- 메타 description TEXT, sort_order INT, is_active BOOLEAN DEFAULT TRUE, -- 감사 created_at, updated_at, deleted_at ); ``` --- ## 3. 품목 코드 매핑 로직 ### 조회 흐름 ``` quote_formula_items.item_code ↓ FormulaEvaluatorService::getItemPrice($itemCode) ↓ Price::getSalesPriceByItemCode($tenantId, $itemCode) ↓ ┌───────────────────────────────────────┐ │ 1. products 테이블 검색 │ │ WHERE tenant_id = $tenantId │ │ AND code = $itemCode │ │ AND deleted_at IS NULL │ └───────────────────────────────────────┘ ↓ (발견시) ┌───────────────────────────────────────┐ │ Price::getCurrentPrice() │ │ item_type_code = 'PRODUCT' │ │ item_id = $product->id │ └───────────────────────────────────────┘ ↓ prices.sales_price 반환 ``` ### 품목 코드 규칙 | 분류 | 코드 형식 예시 | 설명 | |------|--------------|------| | 스크린 제품 | `KS-100-SC` | 스크린 주자재 | | 철재 제품 | `KS-200-ST` | 철재(슬랫) 주자재 | | 모터 | `MT-300K` | 모터 300K | | 케이스 | `PT-CASE-2438` | 케이스 2438mm | | 가이드레일 | `GR-65x80` | 가이드레일 65x80 | --- ## 4. 5130 수식 항목 → SAM 변수 매핑 ### 기본 변수 | 5130 명칭 | SAM 변수 | 수식 유형 | |----------|---------|----------| | 오픈 가로 | W0 | input | | 오픈 세로 | H0 | input | | 제작 가로 | W1 | calculation | | 제작 세로 | H1 | calculation | | 면적 | M | calculation | | 중량 | K | calculation | ### 항목별 변수 | 5130 항목 | SAM 변수 | 수식 유형 | 비고 | |----------|---------|----------|------| | 검사비 | INSP_FEE | calculation | 고정 1EA | | 주자재 | MAT_PRICE | calculation | 면적 × 단가 | | 모터 | MOTOR_SELECT | range | 중량 기준 선택 | | 제어기 | CTRL_SELECT | mapping | 설치유형별 | | 케이스 | CASE_SELECT | range | 길이 기준 선택 | | 가이드레일 | GR_SELECT | range | 길이 기준 선택 | | 마구리 | EDGE_QTY | calculation | 날개치수/50 | --- ## 5. 신규 테이블 생성 불필요 ### 정책 준수 확인 | 항목 | 상태 | 비고 | |------|------|------| | 기존 테이블 활용 | ✅ | prices, quote_formulas 등 | | 신규 테이블 생성 | ❌ 불필요 | 기존 구조 활용 | | 컬럼 추가 | ❌ 불필요 | 기존 컬럼 활용 | | DB 마이그레이션 | ❌ 불필요 | Seeder만 실행 | --- ## 참조 - [README.md](./README.md) - [implementation.md](./implementation.md) - [Phase 1: db-structure.md](../phase-1-5130-analysis/db-structure.md) - [PROJECT_DEVELOPMENT_POLICY.md](../../guides/PROJECT_DEVELOPMENT_POLICY.md)