Files
sam-docs/projects/legacy-5130/03_ESTIMATE.md

290 lines
8.1 KiB
Markdown
Raw Normal View History

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