# 견적 (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` - 번호 생성