# 견적 (Estimate) 분석

## 개요
- **디렉토리**: `/estimate/`
- **DB 테이블**: `estimate` (동적 테이블명 가능)
- **주요 기능**: 견적서 작성, 단가 자동계산, 견적 이력 관리

## 디렉토리 구조
```
/estimate/
├── _request.php              # 요청 파라미터
├── _row.php                  # 행 렌더링
├── insert.php                # 견적 저장
├── list.php                  # 견적 목록
├── list_unit.php             # 단가 목록
├── write_form.php            # 견적서 작성 폼 (103KB)
├── edit.php                  # 견적 수정
├── edit_slat.php             # 슬랫 견적 수정
├── estimate.php              # 견적서 메인
├── estimateSlat.php          # 슬랫 견적
├── estimateUnit.php          # 단가 견적
├── view.php                  # 견적 상세
├── viewEstimate.php          # 견적서 보기
├── viewEstimateDetail.php    # 견적 상세 보기
├── statistics.php            # 견적 통계
├── fetch_unitprice.php       # 단가 조회 (32KB)
├── get_estimate_amount.php   # 견적 금액 계산
├── get_screen_amount.php     # 스크린 금액 계산
├── get_slat_amount.php       # 슬랫 금액 계산
├── generate_serial_pjnum.php # 프로젝트 번호 생성
├── screen_view_*.php         # 스크린 견적 뷰
├── slat_view_*.php           # 슬랫 견적 뷰
└── common/                   # 공통 모듈
```

## DB 스키마

### 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),           -- 모델명
    position VARCHAR(50),              -- 위치

    -- 규격 정보
    makeWidth INT,                     -- 제작 폭 (기본 160)
    makeHeight INT,                    -- 제작 높이 (기본 350)
    maguriWing VARCHAR(20),            -- 마구리 윙 (기본 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),                 -- 강종
    motor VARCHAR(100),                -- 모터
    warranty VARCHAR(100),             -- 보증기간

    -- 체크 플래그
    slatcheck VARCHAR(10),             -- 슬랫 체크
    partscheck VARCHAR(10),            -- 부품 체크

    -- 시스템 필드
    comment TEXT,                      -- 비고
    update_log TEXT,                   -- 수정이력
    is_deleted TINYINT DEFAULT 0,      -- 삭제플래그

    INDEX idx_pjnum (pjnum),
    INDEX idx_outworkplace (outworkplace),
    INDEX idx_indate (indate)
);
```

## 견적 데이터 구조

### estimateList JSON 구조
```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 JSON 구조
```json
[
    {
        "item_code": "AUTO001",
        "item_name": "벤딩 가공비",
        "calc_type": "per_meter",
        "base_value": 120.5,
        "unit_price": 2500,
        "amount": 301250
    }
]
```

## 비즈니스 로직

### 프로젝트 번호 생성
```php
// generate_serial_pjnum.php
function generatePjnum() {
    // 형식: KD-PR-YYMMDD-NN
    // KD: 경동
    // PR: 프로젝트
    // YYMMDD: 날짜
    // NN: 일련번호 (01~99)

    $today = date('ymd');
    $prefix = "KD-PR-{$today}-";

    // 오늘 날짜의 마지막 번호 조회
    $sql = "SELECT pjnum FROM estimate
            WHERE pjnum LIKE '{$prefix}%'
            ORDER BY pjnum DESC LIMIT 1";

    // 일련번호 증가
    $nextNum = str_pad($lastNum + 1, 2, '0', STR_PAD_LEFT);

    return $prefix . $nextNum;
}
```

### 금액 계산
```php
// insert.php
$estimateTotal = intval(str_replace(',', '', $estimateTotal));
$EstimateFirstSum = intval(str_replace(',', '', $EstimateFirstSum));
$EstimateUpdatetSum = intval(str_replace(',', '', $EstimateUpdatetSum));
$EstimateDiffer = intval(str_replace(',', '', $EstimateDiffer));
$EstimateFinalSum = intval(str_replace(',', '', $EstimateFinalSum));
```

### 단가 조회 (fetch_unitprice.php)
- 모델별 기본 단가
- 규격별 가격 가감
- 강종(steel)별 가격 계수
- 마진율 적용

## 견적 유형

### 1. 스크린 견적 (Screen)
- **파일**: `estimate.php`, `screen_view_*.php`
- **특징**: 면적(m²) 기반 계산
- **주요 항목**: 판넬, 가이드레일, 브라켓

### 2. 슬랫 견적 (Slat)
- **파일**: `estimateSlat.php`, `slat_view_*.php`
- **특징**: 폭/높이 기반 계산
- **주요 항목**: 슬랫 코일, 인터락, 샤프트

### 3. 단가 견적 (Unit)
- **파일**: `estimateUnit.php`, `list_unit.php`
- **특징**: 품목별 단가 설정

## 견적서 출력
- `/estimate/print_list.php` - 견적 목록 인쇄
- `/estimate/viewEstimate.php` - 견적서 보기
- `/estimate/saveExcel.php` - 엑셀 저장

## SAM 마이그레이션 포인트

### 1. 견적 구조 개선
```sql
-- SAM: 견적 헤더/상세 분리
estimates (
    id,
    tenant_id,
    estimate_number,      -- 견적번호
    customer_id,          -- 거래처
    project_name,
    estimate_date,
    valid_until,          -- 유효기간
    status,               -- draft, sent, accepted, rejected
    total_amount,
    discount_rate,
    discount_amount,
    final_amount,
    created_by
)

estimate_items (
    id,
    estimate_id,
    item_type,            -- manual, auto_calculated
    item_code,
    item_name,
    specification,
    unit,
    quantity,
    unit_price,
    amount,
    sort_order
)
```

### 2. 단가표 관리
```sql
-- SAM: 단가 마스터
price_masters (
    id,
    tenant_id,
    category_id,
    item_code,
    item_name,
    base_price,
    effective_from,
    effective_to,
    is_active
)

-- SAM: 단가 조건
price_conditions (
    id,
    price_master_id,
    condition_type,       -- size, material, quantity
    condition_value,
    adjustment_type,      -- fixed, percentage
    adjustment_value
)
```

### 3. 견적 이력
```sql
-- SAM: 견적 버전 관리
estimate_versions (
    id,
    estimate_id,
    version,
    snapshot JSON,        -- 견적 전체 스냅샷
    changed_by,
    changed_at,
    change_reason
)
```

## 참고 파일
- `/estimate/insert.php` - 저장 로직
- `/estimate/write_form.php` - 견적서 UI (대용량 파일)
- `/estimate/fetch_unitprice.php` - 단가 계산 로직
- `/estimate/generate_serial_pjnum.php` - 번호 생성
