# Phase 1.2: 다건 BOM 기반 자동산출 API

## 개요
- **작업일**: 2026-01-02
- **커밋**: `4e59bbf` feat: Phase 1.2 - 다건 BOM 기반 자동산출 API 구현
- **목적**: React 견적등록 화면에서 여러 품목의 자동산출 일괄 요청

## API 엔드포인트
```
POST /api/v1/quotes/calculate/bom/bulk
```

## 파일 목록

### 생성된 파일
| 파일 | 설명 |
|------|------|
| `app/Http/Requests/Quote/QuoteBomBulkCalculateRequest.php` | 다건 BOM 산출 FormRequest |
| `api/docs/changes/20260102_1300_quote_bom_bulk_calculation.md` | 변경 내용 문서 |

### 수정된 파일
| 파일 | 설명 |
|------|------|
| `app/Services/Quote/QuoteCalculationService.php` | calculateBomBulk() 메서드 추가 |
| `app/Http/Controllers/Api/V1/QuoteController.php` | calculateBomBulk 액션 추가 |
| `routes/api.php` | /calculate/bom/bulk 라우트 추가 |
| `app/Swagger/v1/QuoteApi.php` | 스키마 3개 + 엔드포인트 추가 |

## React → API 필드 매핑

| React 필드 (camelCase) | API 변수 (약어) | 설명 |
|----------------------|----------------|------|
| openWidth | W0 | 개구부 폭 (mm) |
| openHeight | H0 | 개구부 높이 (mm) |
| quantity | QTY | 수량 |
| productCategory | PC | 제품 카테고리 |
| guideRailType | GT | 가이드레일 타입 |
| motorPower | MP | 모터 출력 |
| controller | CT | 제어반 |
| wingSize | WS | 날개 크기 |
| inspectionFee | INSP | 검사비 |

## 요청/응답 예시

### 요청
```json
{
  "items": [
    {
      "finished_goods_code": "SC-1000",
      "openWidth": 3000,
      "openHeight": 2500,
      "quantity": 2
    },
    {
      "finished_goods_code": "SC-2000",
      "W0": 4000,
      "H0": 3000,
      "QTY": 1
    }
  ],
  "debug": false
}
```

### 응답
```json
{
  "success": true,
  "message": "견적 일괄 산출이 완료되었습니다.",
  "data": {
    "success": true,
    "summary": {
      "total_count": 2,
      "success_count": 2,
      "fail_count": 0,
      "grand_total": 2500000
    },
    "items": [...]
  }
}
```

## 핵심 로직

### QuoteBomBulkCalculateRequest::getInputItems()
- React camelCase 필드명을 API 약어로 자동 변환
- 양쪽 필드명 모두 지원 (하위 호환성)

### QuoteCalculationService::calculateBomBulk()
- 각 품목에 대해 calculateBom() 순회 호출
- 성공/실패 카운트 집계
- 개별 품목 실패가 전체에 영향 없음 (예외 처리)

## 관련 문서
- 계획 문서: `docs/plans/quote-calculation-api-plan.md`
- Phase 1.1 문서: `docs/changes/20260102_quote_bom_calculation_api.md`
- Phase 1.2 문서: `docs/changes/20260102_1300_quote_bom_bulk_calculation.md`

## 다음 단계
- React 프론트엔드에서 `/calculate/bom/bulk` API 연동
- 실제 품목 데이터로 테스트
- 저장 플로우 연결 (`POST /quotes` store API)
