319 lines
9.1 KiB
Markdown
319 lines
9.1 KiB
Markdown
|
|
# 견적 시스템 개발 계획
|
|||
|
|
|
|||
|
|
> **작성일**: 2025-12-24
|
|||
|
|
> **목표**: mng 수식 시뮬레이터를 완전한 견적 시스템으로 확장 후 React API 개발
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. 개발 단계
|
|||
|
|
|
|||
|
|
### Stage 1: mng 견적 시스템 완성 (현재)
|
|||
|
|
**목표**: 스크린샷과 동일한 견적 시스템을 mng Plain Blade로 구현
|
|||
|
|
|
|||
|
|
### Stage 2: API 개발
|
|||
|
|
**목표**: React 프론트엔드에서 호출할 견적 산출 REST API 개발
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. 현재 상태 vs 목표 상태
|
|||
|
|
|
|||
|
|
### 2.1 입력 폼 비교
|
|||
|
|
|
|||
|
|
| 필드 | 현재 시뮬레이터 | 목표 (스크린샷) | 상태 |
|
|||
|
|
|------|----------------|----------------|------|
|
|||
|
|
| 층수 | ❌ | 예: 1층, B1, 지하1층 | 추가 필요 |
|
|||
|
|
| 부호 | ❌ | 예: A, B, C | 추가 필요 |
|
|||
|
|
| 제품 카테고리 (PC) | ✅ | 스크린, 철재 등 | 완료 |
|
|||
|
|
| 제품명 | ✅ | 방화 스크린 셔터 등 | 완료 |
|
|||
|
|
| 오픈사이즈 W0 | ✅ | 가로 | 완료 |
|
|||
|
|
| 오픈사이즈 H0 | ✅ | 세로 | 완료 |
|
|||
|
|
| 가이드레일 설치유형 (GT) | ✅ | 벽면형, 측면형 | 완료 |
|
|||
|
|
| 모터 전원 (MP) | ✅ | 220V, 380V | 완료 |
|
|||
|
|
| 연동제어기 (CT) | ✅ | 단독, 연동 | 완료 |
|
|||
|
|
| 수량 (QTY) | ✅ | 1, 2, 3... | 완료 |
|
|||
|
|
| 마구리 날개치수 (WS) | ❌ | 50 등 | 추가 필요 |
|
|||
|
|
| 검사비 (INSP) | ❌ | 50000 등 | 추가 필요 |
|
|||
|
|
|
|||
|
|
### 2.2 출력 결과 비교
|
|||
|
|
|
|||
|
|
| 섹션 | 현재 시뮬레이터 | 목표 (스크린샷) | 상태 |
|
|||
|
|
|------|----------------|----------------|------|
|
|||
|
|
| 입력 정보 요약 | ❌ | 제품명, 카테고리, 오픈사이즈, 설치유형 등 요약 | 추가 필요 |
|
|||
|
|
| 기본 산출 공식 | ❌ | 제작폭(W1), 제작높이(H1), 면적(M), 중량(K) 표시 | 추가 필요 |
|
|||
|
|
| BOM 목록 테이블 | ⚠️ 공정별 그룹화 | 순번, 품목코드, 품목명, 품목유형, 규격, 기준수량, 산출수량, 단위, 단가, 금액, 작업 | 구조 변경 필요 |
|
|||
|
|
| 품목 추가/삭제 | ❌ | + 품목 추가 버튼, 휴지통 삭제 버튼 | 추가 필요 |
|
|||
|
|
| 할인율 | ❌ | 할인율(%) 입력 | 추가 필요 |
|
|||
|
|
| 금액 요약 | ⚠️ 합계만 | 합계, 공급가, 최종 금액 | 확장 필요 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 3. Stage 1: mng 견적 시스템 상세 계획
|
|||
|
|
|
|||
|
|
### Phase 1: UI 확장 (1일)
|
|||
|
|
**파일**: `resources/views/quote-formulas/simulator.blade.php`
|
|||
|
|
|
|||
|
|
#### 1.1 입력 폼 확장
|
|||
|
|
```
|
|||
|
|
추가 필드:
|
|||
|
|
- 층수 (floor): text input, placeholder "예: 1층, B1, 지하1층"
|
|||
|
|
- 부호 (code): text input, placeholder "예: A, B, C"
|
|||
|
|
- 마구리 날개치수 (WS): number input, default 50
|
|||
|
|
- 검사비 (INSP): number input, default 50000
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 1.2 견적 항목 다중 입력
|
|||
|
|
```
|
|||
|
|
- 견적 1, 견적 2, ... 탭 형태
|
|||
|
|
- "+ 견적 추가" 버튼
|
|||
|
|
- 복사, 삭제 버튼
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 1.3 결과 출력 섹션
|
|||
|
|
```
|
|||
|
|
1. 입력 정보 요약 카드
|
|||
|
|
- 제품명, 제품 카테고리, 오픈사이즈, 가이드레일 설치, 모터 전원, 연동제어기, 수량
|
|||
|
|
|
|||
|
|
2. 기본 산출 공식 카드
|
|||
|
|
- 제작폭 (W1): 값 + 계산식
|
|||
|
|
- 제작높이 (H1): 값 + 계산식
|
|||
|
|
- 면적 (M): 값 + 단위
|
|||
|
|
- 중량 (K): 값 + 단위
|
|||
|
|
|
|||
|
|
3. 부품구성표(BOM) 목록 테이블
|
|||
|
|
- 컬럼: 순번, 품목코드, 품목명, 품목유형, 규격, 기준수량, 산출수량, 단위, 단가, 금액, 작업
|
|||
|
|
- "+ 품목 추가" 버튼
|
|||
|
|
- 행별 삭제 버튼
|
|||
|
|
|
|||
|
|
4. 금액 요약
|
|||
|
|
- 할인율(%) 입력
|
|||
|
|
- 합계, 공급가, 최종 금액
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Phase 2: 백엔드 로직 확장 (1일)
|
|||
|
|
**파일**: `app/Services/Quote/FormulaEvaluatorService.php`
|
|||
|
|
|
|||
|
|
#### 2.1 executeAll() 반환 구조 확장
|
|||
|
|
```php
|
|||
|
|
return [
|
|||
|
|
'input_summary' => [
|
|||
|
|
'product_name' => '방화 스크린 셔터 (소형)',
|
|||
|
|
'product_category' => '스크린',
|
|||
|
|
'open_size' => 'W2000 × H2500',
|
|||
|
|
'guide_rail_type' => '벽면형',
|
|||
|
|
'motor_power' => '220V',
|
|||
|
|
'controller' => '단독',
|
|||
|
|
'quantity' => 1,
|
|||
|
|
],
|
|||
|
|
'calculation_formula' => [
|
|||
|
|
'W1' => ['value' => 2140, 'formula' => 'W0 + 140'],
|
|||
|
|
'H1' => ['value' => 2850, 'formula' => 'H0 + 350'],
|
|||
|
|
'M' => ['value' => 6.10, 'unit' => '㎡'],
|
|||
|
|
'K' => ['value' => 0.00, 'unit' => 'kg'],
|
|||
|
|
],
|
|||
|
|
'bom_items' => [
|
|||
|
|
[
|
|||
|
|
'seq' => 1,
|
|||
|
|
'item_code' => 'SF-SCR-F01',
|
|||
|
|
'item_name' => '스크린 원단',
|
|||
|
|
'item_type' => 'SF',
|
|||
|
|
'spec' => '-',
|
|||
|
|
'base_quantity' => 1.10,
|
|||
|
|
'calculated_quantity' => 6.099,
|
|||
|
|
'unit' => 'M2',
|
|||
|
|
'unit_price' => 213465,
|
|||
|
|
'total_price' => 1301923.035,
|
|||
|
|
'editable' => true,
|
|||
|
|
],
|
|||
|
|
// ... more items
|
|||
|
|
],
|
|||
|
|
'summary' => [
|
|||
|
|
'subtotal' => 2806523.035,
|
|||
|
|
'discount_rate' => 0,
|
|||
|
|
'discount_amount' => 0,
|
|||
|
|
'supply_price' => 2806523.035,
|
|||
|
|
'total_amount' => 2806523.035,
|
|||
|
|
],
|
|||
|
|
];
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Phase 3: 검사비 품목 추가 (0.5일)
|
|||
|
|
**파일**: `database/seeders/DesignItemSeeder.php`
|
|||
|
|
|
|||
|
|
```php
|
|||
|
|
// 서비스 품목 추가
|
|||
|
|
$serviceItems = [
|
|||
|
|
['code' => 'SVC-INSP', 'name' => '검사비', 'unit' => '식', 'price' => 50000, 'type' => 'CS'],
|
|||
|
|
['code' => 'SVC-INSTALL', 'name' => '설치비', 'unit' => '식', 'price' => 100000, 'type' => 'CS'],
|
|||
|
|
['code' => 'SVC-DELIVERY', 'name' => '운송비', 'unit' => '식', 'price' => 80000, 'type' => 'CS'],
|
|||
|
|
];
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Phase 4: 테스트 및 검증 (0.5일)
|
|||
|
|
- Playwright로 전체 플로우 테스트
|
|||
|
|
- Design 시스템 결과와 비교 검증
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 4. Stage 2: API 개발 상세 계획
|
|||
|
|
|
|||
|
|
### Phase 1: API 엔드포인트 설계 (0.5일)
|
|||
|
|
|
|||
|
|
#### 4.1 견적 산출 API
|
|||
|
|
```
|
|||
|
|
POST /api/v1/quotes/calculate
|
|||
|
|
|
|||
|
|
Request:
|
|||
|
|
{
|
|||
|
|
"items": [
|
|||
|
|
{
|
|||
|
|
"floor": "1층",
|
|||
|
|
"code": "A",
|
|||
|
|
"product_category": "screen",
|
|||
|
|
"product_id": "screen_standard",
|
|||
|
|
"open_width": 2000,
|
|||
|
|
"open_height": 2500,
|
|||
|
|
"guide_rail_type": "wall",
|
|||
|
|
"motor_power": "220V",
|
|||
|
|
"controller": "single",
|
|||
|
|
"quantity": 1,
|
|||
|
|
"wing_size": 50,
|
|||
|
|
"inspection_fee": 50000
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"discount_rate": 0
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Response:
|
|||
|
|
{
|
|||
|
|
"success": true,
|
|||
|
|
"data": {
|
|||
|
|
"quotes": [
|
|||
|
|
{
|
|||
|
|
"quote_id": "quote-1",
|
|||
|
|
"input_summary": { ... },
|
|||
|
|
"calculation_formula": { ... },
|
|||
|
|
"bom_items": [ ... ],
|
|||
|
|
"summary": { ... }
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"total_summary": {
|
|||
|
|
"total_items": 1,
|
|||
|
|
"total_amount": 2806523.035
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 4.2 제품 목록 API
|
|||
|
|
```
|
|||
|
|
GET /api/v1/quotes/products?category=screen
|
|||
|
|
|
|||
|
|
Response:
|
|||
|
|
{
|
|||
|
|
"success": true,
|
|||
|
|
"data": [
|
|||
|
|
{
|
|||
|
|
"id": "screen_standard",
|
|||
|
|
"name": "스크린 셔터 (표준형)",
|
|||
|
|
"category": "screen"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 4.3 옵션 목록 API
|
|||
|
|
```
|
|||
|
|
GET /api/v1/quotes/options
|
|||
|
|
|
|||
|
|
Response:
|
|||
|
|
{
|
|||
|
|
"success": true,
|
|||
|
|
"data": {
|
|||
|
|
"product_categories": [...],
|
|||
|
|
"guide_rail_types": [...],
|
|||
|
|
"motor_powers": [...],
|
|||
|
|
"controllers": [...]
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Phase 2: API 컨트롤러 구현 (1일)
|
|||
|
|
**파일**: `api/app/Http/Controllers/Api/V1/QuoteCalculationController.php`
|
|||
|
|
|
|||
|
|
### Phase 3: API 테스트 (0.5일)
|
|||
|
|
- Postman/Swagger 테스트
|
|||
|
|
- React 연동 테스트
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 5. 일정 요약
|
|||
|
|
|
|||
|
|
| Stage | Phase | 작업 내용 | 예상 일정 |
|
|||
|
|
|-------|-------|----------|----------|
|
|||
|
|
| **Stage 1** | Phase 1 | mng UI 확장 | 1일 |
|
|||
|
|
| | Phase 2 | 백엔드 로직 확장 | 1일 |
|
|||
|
|
| | Phase 3 | 검사비 품목 추가 | 0.5일 |
|
|||
|
|
| | Phase 4 | 테스트 및 검증 | 0.5일 |
|
|||
|
|
| | **소계** | | **3일** |
|
|||
|
|
| **Stage 2** | Phase 1 | API 설계 | 0.5일 |
|
|||
|
|
| | Phase 2 | API 구현 | 1일 |
|
|||
|
|
| | Phase 3 | API 테스트 | 0.5일 |
|
|||
|
|
| | **소계** | | **2일** |
|
|||
|
|
| **합계** | | | **5일** |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 6. 파일 구조
|
|||
|
|
|
|||
|
|
### Stage 1 (mng)
|
|||
|
|
```
|
|||
|
|
/SAM/mng/
|
|||
|
|
├── app/Services/Quote/
|
|||
|
|
│ └── FormulaEvaluatorService.php # 로직 확장
|
|||
|
|
├── database/seeders/
|
|||
|
|
│ └── DesignItemSeeder.php # 서비스 품목 추가
|
|||
|
|
└── resources/views/quote-formulas/
|
|||
|
|
└── simulator.blade.php # UI 확장
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Stage 2 (api)
|
|||
|
|
```
|
|||
|
|
/SAM/api/
|
|||
|
|
├── app/Http/Controllers/Api/V1/
|
|||
|
|
│ └── QuoteCalculationController.php # 신규
|
|||
|
|
├── app/Services/Quote/
|
|||
|
|
│ └── QuoteCalculationService.php # 신규 (또는 mng 서비스 공유)
|
|||
|
|
└── routes/
|
|||
|
|
└── api.php # 라우트 추가
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 7. 성공 기준
|
|||
|
|
|
|||
|
|
### Stage 1
|
|||
|
|
1. ✅ 스크린샷과 동일한 입력 폼 (층수, 부호, WS, INSP 포함)
|
|||
|
|
2. ✅ 입력 정보 요약 섹션 표시
|
|||
|
|
3. ✅ 기본 산출 공식 섹션 표시
|
|||
|
|
4. ✅ BOM 테이블 (순번~금액 컬럼)
|
|||
|
|
5. ✅ 품목 추가/삭제 기능
|
|||
|
|
6. ✅ 할인율 + 최종 금액 계산
|
|||
|
|
|
|||
|
|
### Stage 2
|
|||
|
|
1. ✅ POST /api/v1/quotes/calculate 정상 작동
|
|||
|
|
2. ✅ GET /api/v1/quotes/products 정상 작동
|
|||
|
|
3. ✅ GET /api/v1/quotes/options 정상 작동
|
|||
|
|
4. ✅ Swagger 문서화 완료
|
|||
|
|
5. ✅ React에서 API 호출 테스트 완료
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 8. 참고 문서
|
|||
|
|
|
|||
|
|
- `docs/plans/simulator-calculation-logic-mapping.md` - 계산 로직 상세
|
|||
|
|
- `react/src/components/quotes/QuoteRegistration.tsx` - React UI 참조
|
|||
|
|
- `design/src/components/AutoCalculationSimulator.tsx` - Design 시뮬레이터 참조
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
*이 문서는 mng 견적 시스템 완성 및 API 개발 계획을 정의합니다.*
|