# 캠페인 최종 승인 뷰 — 별도 컴포넌트로 구현

## 긴급도: CRITICAL
task-1383.1이 CampaignView.js(1247줄, 86KB) 컨텍스트 초과로 실패.
CampaignView.js를 수정하지 말고, **별도 컴포넌트 파일**로 구현.

## 핵심 규칙
- **CampaignView.js 읽지 마세요** — 86KB로 토큰이 터집니다
- 별도 파일 `FinalApprovalView.js`로 생성
- CampaignView.js에는 import + 탭 연결 1줄만 추가

## 구현할 파일
`/home/jay/workspace/dashboard/components/FinalApprovalView.js`

## 기능

### 3x3 매트릭스 최종 승인 그리드
- 9개 셀 (①~⑨) 카드 형태로 표시
- 각 셀 정보: campaign.json → matrix_3x3.cells[n]

### 셀 클릭 시 상세 패널 (모달 또는 확장)
1. **최종 배너 미리보기** — 파일 경로, 이미지 표시
2. **최종 카피** — Primary Text, Headline, Description, CTA, 훅 유형, 업계 이슈 반영
3. **채널 배정** — Meta/Google/네이버 등 어느 채널에 어떤 배너+카피
4. **랜딩 URL** — UTM 포함
5. **승인 버튼** — 승인 / 수정필요 / 코멘트

### 전체 승인 현황
- 승인 N/9 프로그레스
- 9/9 완료 시 "광고 업로드 준비 완료" 표시

## 데이터 구조 (campaign.json에 추가)
campaign.json에 `final_approval` 키 추가:
```json
{
  "final_approval": {
    "cells": [
      {
        "cell_id": 1,
        "label": "정당한보상 × 인카다이렉트",
        "status": "pending",
        "approved_at": null,
        "comment": "",
        "final_banner": {},
        "final_copy": {},
        "channel_assignment": {},
        "landing_url": ""
      }
    ],
    "overall_status": "in_progress",
    "approved_count": 0
  }
}
```

## 서버 API
`/home/jay/workspace/dashboard/server.py`에 엔드포인트 추가:
- `POST /api/campaign/approve` — 셀 승인 상태 업데이트
- `GET /api/campaign/approval-status` — 전체 승인 현황

server.py도 대용량이므로 **기존 캠페인 API 근처에만** offset/limit으로 읽고 추가할 것.

## CampaignView.js 최소 수정
CampaignView.js를 전체 읽지 말고, 마지막 부분(export 근처)만 읽어서:
- `import FinalApprovalView from './FinalApprovalView'` 추가
- 기존 탭 시스템에 "최종 승인" 탭 1개 추가
- 해당 탭 선택 시 `<FinalApprovalView />` 렌더링

## 산출물
1. FinalApprovalView.js (신규)
2. campaign.json에 final_approval 데이터 추가
3. server.py에 승인 API 추가
4. CampaignView.js에 탭 연결 (최소 수정)
5. 보고서
