136 lines
4.1 KiB
Markdown
136 lines
4.1 KiB
Markdown
|
|
# 변경 내용 요약
|
||
|
|
|
||
|
|
**날짜:** 2026-01-02
|
||
|
|
**작업자:** Claude Code
|
||
|
|
**작업명:** 견적 산출 API 개발 - Phase 1.1 API 계산 로직 구현
|
||
|
|
|
||
|
|
## 📋 변경 개요
|
||
|
|
MNG FormulaEvaluatorService의 BOM 기반 견적 계산 로직을 API에서 호출할 수 있는 엔드포인트를 구현했습니다. 완제품 코드와 입력 변수를 받아 품목/단가/금액을 자동 계산하며, 10단계 디버깅 정보를 제공합니다.
|
||
|
|
|
||
|
|
## 📁 수정된 파일
|
||
|
|
|
||
|
|
### 신규 파일
|
||
|
|
- `api/app/Http/Requests/Quote/QuoteBomCalculateRequest.php` - BOM 계산용 FormRequest
|
||
|
|
|
||
|
|
### 수정된 파일
|
||
|
|
- `api/app/Services/Quote/QuoteCalculationService.php` - calculateBom 메서드 추가
|
||
|
|
- `api/app/Http/Controllers/Api/V1/QuoteController.php` - calculateBom 액션 추가
|
||
|
|
- `api/routes/api.php` - /calculate/bom 라우트 추가
|
||
|
|
- `api/app/Swagger/v1/QuoteApi.php` - 스키마 및 엔드포인트 문서 추가
|
||
|
|
|
||
|
|
## 🔧 상세 변경 사항
|
||
|
|
|
||
|
|
### 1. QuoteBomCalculateRequest.php (신규)
|
||
|
|
**목적:** BOM 기반 견적 계산 요청 검증
|
||
|
|
|
||
|
|
**주요 기능:**
|
||
|
|
- 필수 입력: `finished_goods_code`, `W0`, `H0`
|
||
|
|
- 선택 입력: `QTY`, `PC`, `GT`, `MP`, `CT`, `WS`, `INSP`, `debug`
|
||
|
|
- `getInputVariables()`: 서비스용 입력 변수 배열 반환
|
||
|
|
|
||
|
|
### 2. QuoteCalculationService.php
|
||
|
|
**변경 전:** BOM 계산 메서드 없음
|
||
|
|
|
||
|
|
**변경 후:**
|
||
|
|
```php
|
||
|
|
public function calculateBom(string $finishedGoodsCode, array $inputs, bool $debug = false): array
|
||
|
|
{
|
||
|
|
$tenantId = $this->tenantId();
|
||
|
|
$result = $this->formulaEvaluator->calculateBomWithDebug(
|
||
|
|
$finishedGoodsCode,
|
||
|
|
$inputs,
|
||
|
|
$tenantId
|
||
|
|
);
|
||
|
|
if (! $debug && isset($result['debug_steps'])) {
|
||
|
|
unset($result['debug_steps']);
|
||
|
|
}
|
||
|
|
return $result;
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**이유:** API에서 MNG FormulaEvaluatorService의 calculateBomWithDebug를 호출할 수 있도록 브릿지 메서드 추가
|
||
|
|
|
||
|
|
### 3. QuoteController.php
|
||
|
|
**변경 후:**
|
||
|
|
```php
|
||
|
|
public function calculateBom(QuoteBomCalculateRequest $request)
|
||
|
|
{
|
||
|
|
return ApiResponse::handle(function () use ($request) {
|
||
|
|
return $this->calculationService->calculateBom(
|
||
|
|
$request->finished_goods_code,
|
||
|
|
$request->getInputVariables(),
|
||
|
|
$request->boolean('debug', false)
|
||
|
|
);
|
||
|
|
}, __('message.quote.calculated'));
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**이유:** REST API 엔드포인트 제공
|
||
|
|
|
||
|
|
### 4. routes/api.php
|
||
|
|
**추가된 라우트:**
|
||
|
|
```php
|
||
|
|
Route::post('/calculate/bom', [QuoteController::class, 'calculateBom'])->name('v1.quotes.calculate-bom');
|
||
|
|
```
|
||
|
|
|
||
|
|
### 5. QuoteApi.php (Swagger)
|
||
|
|
**추가된 스키마:**
|
||
|
|
- `QuoteBomCalculateRequest` - 요청 스키마
|
||
|
|
- `QuoteBomCalculationResult` - 응답 스키마
|
||
|
|
|
||
|
|
**추가된 엔드포인트:**
|
||
|
|
- `POST /api/v1/quotes/calculate/bom` - BOM 기반 자동산출 (10단계 디버깅)
|
||
|
|
|
||
|
|
## ✅ 테스트 체크리스트
|
||
|
|
- [x] PHP 문법 검사 통과
|
||
|
|
- [x] Pint 코드 스타일 검사 통과
|
||
|
|
- [x] 라우트 등록 확인
|
||
|
|
- [x] 서비스 로직 검증 (tinker)
|
||
|
|
- [x] Swagger 문서 생성 확인
|
||
|
|
- [ ] 실제 API 호출 테스트 (Docker 환경 필요)
|
||
|
|
|
||
|
|
## ⚠️ 배포 시 주의사항
|
||
|
|
- 특이사항 없음
|
||
|
|
- 기존 API에 영향 없음 (신규 엔드포인트 추가)
|
||
|
|
|
||
|
|
## 🔗 관련 문서
|
||
|
|
- 계획 문서: `docs/plans/quote-calculation-api-plan.md`
|
||
|
|
- FormulaEvaluatorService: `api/app/Services/Quote/FormulaEvaluatorService.php`
|
||
|
|
|
||
|
|
## 📊 API 사용 예시
|
||
|
|
|
||
|
|
### 요청
|
||
|
|
```bash
|
||
|
|
curl -X POST "http://api.sam.kr/api/v1/quotes/calculate/bom" \
|
||
|
|
-H "Authorization: Bearer {token}" \
|
||
|
|
-H "Content-Type: application/json" \
|
||
|
|
-d '{
|
||
|
|
"finished_goods_code": "SC-1000",
|
||
|
|
"W0": 3000,
|
||
|
|
"H0": 2500,
|
||
|
|
"QTY": 1,
|
||
|
|
"PC": "SCREEN",
|
||
|
|
"GT": "wall",
|
||
|
|
"MP": "single",
|
||
|
|
"CT": "basic",
|
||
|
|
"debug": true
|
||
|
|
}'
|
||
|
|
```
|
||
|
|
|
||
|
|
### 응답
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"success": true,
|
||
|
|
"message": "견적이 산출되었습니다.",
|
||
|
|
"data": {
|
||
|
|
"success": true,
|
||
|
|
"finished_goods": {"code": "SC-1000", "name": "전동스크린 1000형"},
|
||
|
|
"variables": {"W0": 3000, "H0": 2500, "W1": 3100, "H1": 2650, "M": 8.215, "K": 12.5},
|
||
|
|
"items": [...],
|
||
|
|
"grouped_items": {...},
|
||
|
|
"subtotals": {"material": 500000, "labor": 100000, "install": 50000},
|
||
|
|
"grand_total": 650000,
|
||
|
|
"debug_steps": [...]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|