# InsuRo 보험료 데이터 업로드 — 파싱 모드 선택 + 표 추출 기능

## 작업 레벨: Lv.2

## 프로젝트 시스템 3문서
- DevSystem: `/home/jay/workspace/memory/plans/anu-guide-system/plan.md`

## 프로젝트
- InsuRo: `/home/jay/projects/InsuRo`
- 서버: `/home/jay/projects/InsuRo/server`

## 배경
보험료 비교표 PPTX를 업로드했으나 현재 파싱이 주석(※)만 반복 추출하고 표 안의 실제 데이터(보험사명, 상품명, 보험료 숫자)를 전혀 읽지 못함.

원본 데이터 형태 (PPTX 슬라이드):
- 제목: "1. 손해보험 3대질병(일반심사)"
- 표: 구분(보험사) | 상품명 | 남성(보험료,암,유사암,뇌혈관,허혈성) | 여성(동일)
- 연령별 그룹: 10세, 20세, 30세...
- 하단 주석: "※ 20년납 100세만기, 납입면제형, 암/뇌/심 1천만원, 유사암 2백만원"

## 수정 사항

### 1. 프론트엔드: 파싱 모드 선택 UI
`src/pages/AdminPremiumData.tsx` — 업로드 다이얼로그에 파싱 모드 선택 추가:

```
파싱 모드:
○ 자동 분석 (기본)      ← "AI가 파일 형식을 판단하여 최적의 방식으로 분석합니다"
○ 표 데이터 추출         ← "보험료 비교표처럼 표 형태의 PPTX/PDF에 적합합니다"
○ 이미지 분석(Vision)    ← "스캔 문서나 이미지가 포함된 PDF에 적합합니다"
```

- 라디오 버튼 3개 + 각 옵션 옆에 짧은 안내 문구 (text-xs text-muted-foreground)
- 기본값: "자동 분석"
- 선택값을 API 요청 시 `parse_mode` 파라미터로 전송

### 2. 서버: parse_mode 파라미터 처리
`server/main.py` — `upload-to-drive` 및 `parse-premium-file` 엔드포인트:

- 요청 파라미터에 `parse_mode: str = "auto"` 추가 (값: "auto" | "table" | "vision")
- `_smart_parse_file()` 함수에 `parse_mode` 전달

### 3. 서버: python-pptx 표 추출 기능 구현
`server/main.py`의 `_smart_parse_file()` 또는 별도 함수:

```python
def _extract_pptx_tables(file_path: str) -> str:
    """python-pptx로 PPTX 내 표 데이터를 직접 추출하여 구조화된 텍스트 반환."""
    from pptx import Presentation
    prs = Presentation(file_path)
    result_parts = []
    
    for slide_idx, slide in enumerate(prs.slides, 1):
        # 슬라이드 제목 추출
        title = ""
        for shape in slide.shapes:
            if shape.has_text_frame and not shape.has_table:
                text = shape.text_frame.text.strip()
                if text and len(text) < 200:
                    title = text
                    break
        
        # 표 추출
        for shape in slide.shapes:
            if shape.has_table:
                table = shape.table
                if title:
                    result_parts.append(f"\n### {title}\n")
                
                # 헤더 행
                headers = [table.cell(0, col).text.strip() for col in range(len(table.columns))]
                result_parts.append(" | ".join(headers))
                result_parts.append("-" * 40)
                
                # 데이터 행
                for row_idx in range(1, len(table.rows)):
                    cells = [table.cell(row_idx, col).text.strip() for col in range(len(table.columns))]
                    result_parts.append(" | ".join(cells))
        
        # 표 외 텍스트 (주석 등)
        for shape in slide.shapes:
            if shape.has_text_frame and not shape.has_table:
                text = shape.text_frame.text.strip()
                if text and text != title:
                    result_parts.append(f"\n{text}")
    
    return "\n".join(result_parts)
```

### 4. parse_mode별 분기 로직

`_smart_parse_file()` 수정:

```python
if parse_mode == "table":
    # PPTX: python-pptx 표 직접 추출
    if ext in (".pptx", ".ppt"):
        extracted = _extract_pptx_tables(file_path)
    # PDF: pdfplumber extract_tables() 사용
    elif ext == ".pdf":
        extracted = _extract_pdf_tables(file_path)  # pdfplumber.extract_tables()
    
elif parse_mode == "vision":
    # 모든 페이지를 이미지로 변환 → Claude Vision으로 분석
    # 기존 Vision 분기 로직 강제 적용
    
else:  # "auto" — 기존 스마트 분기 로직 유지
    ...
```

### 5. 기존 데이터 재분석 지원
AdminPremiumData.tsx에서 이미 "재분석" 버튼이 있으므로:
- 재분석 시에도 parse_mode 선택 가능하게
- 기존에 잘못 추출된 데이터를 "표 데이터 추출" 모드로 다시 분석 가능

## affected_files
- `src/pages/AdminPremiumData.tsx` (수정 — 파싱 모드 선택 UI)
- `server/main.py` (수정 — parse_mode 파라미터 + _extract_pptx_tables 함수 + 분기 로직)

## 검증 시나리오
1. 업로드 다이얼로그에서 파싱 모드 3개 라디오 버튼 + 안내 문구 표시
2. "표 데이터 추출" 선택 → PPTX 업로드 → 보험사명/상품명/보험료 숫자 정확 추출
3. 추출 결과에 "농협손보 | NH아이맘 헤아림어린이보험 | 13,734 | 5,880 | 504 | ..." 형태 텍스트
4. "자동 분석" 선택 → 기존 로직 동일 작동
5. "이미지 분석(Vision)" 선택 → Vision 강제 적용
6. 재분석 시 parse_mode 변경 가능
7. npm run build 성공
8. 서버 curl 테스트: parse_mode=table 파라미터 정상 처리
