Files
sam-docs/changes/20260102_quote_bom_calculation_api.md

136 lines
4.1 KiB
Markdown
Raw Normal View History

# 변경 내용 요약
**날짜:** 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": [...]
}
}
```