# task-437.1: InsuRo 히든플랜 + is_public 컬럼 + PlanUpgradeDialog DB 연동

## 배경
- InsuRo 프로젝트: `/home/jay/projects/InsuRo/`
- Supabase URL/KEY: `/home/jay/projects/InsuRo/.env` 참조
- service_role key: `/home/jay/workspace/.env.keys` 참조
- task-435.1에서 feature_definitions 14건 + subscription_plans 5건 seed 완료

## 제이회장님 요구사항
지점 내부 직원용 **히든플랜**을 만들어야 한다.
- 겉으로(유저 화면)에는 안 보임
- 관리자가 설정 가능 (AdminSubscriptions에서 편집)
- 지점 내부 사람들이 무료이지만 전 기능 사용 가능

## 작업 내용

### 1. subscription_plans 테이블에 is_public 컬럼 추가

Supabase SQL로 ALTER TABLE:
```sql
ALTER TABLE public.subscription_plans
ADD COLUMN IF NOT EXISTS is_public boolean NOT NULL DEFAULT true;

COMMENT ON COLUMN public.subscription_plans.is_public IS '사용자에게 공개되는 플랜 여부. false면 히든플랜(관리자만 배정 가능)';
```

service_role key로 Supabase REST API 또는 SQL 실행.

### 2. 히든플랜 INSERT

```sql
INSERT INTO public.subscription_plans (name, description, plan_type, price, features, is_active, is_public, sort_order)
VALUES (
  'Internal',
  '지점 내부 직원 전용 (비공개)',
  'individual',
  0,
  '{
    "ai_generate": true,
    "content_calendar": true,
    "insurance_tools": true,
    "ai_health_analysis": true,
    "ai_design_proposal": true,
    "digital_namecard": true,
    "keyword_tools": true,
    "ai_provider": "gemini-flash",
    "ai_image_generate": true,
    "max_contents_per_month": -1,
    "max_images_per_month": -1,
    "max_images_per_generation": 8,
    "org_management": false,
    "agent_management": false
  }'::jsonb,
  true,
  false,
  99
);
```

- price: 0 (무료)
- is_public: false (유저에게 안 보임)
- is_active: true (활성 상태)
- features: Enterprise와 동일 수준이되 ai_provider는 gemini-flash (비용 절감)
- org 기능은 false (개인 단위 사용)

### 3. PlanUpgradeDialog.tsx — DB에서 플랜 읽기 + is_public 필터

현재 하드코딩된 plans 배열을 DB에서 동적으로 읽도록 변경.

파일: `/home/jay/projects/InsuRo/src/components/PlanUpgradeDialog.tsx`

변경사항:
1. DB에서 `subscription_plans` 조회: `is_active = true AND is_public = true` 필터
2. 조회된 데이터를 기존 UI 구조에 맞게 렌더링
3. 기존 하드코딩 배열 제거
4. 할인율(OPEN_DISCOUNT, YEARLY_DISCOUNT)은 그대로 유지
5. 아이콘 매핑: Free→Zap, Basic→Zap, Pro→Sparkles, Premium→Crown, Enterprise→Shield (이름 기반)

### 4. AdminSubscriptions.tsx — is_public 토글 추가

파일: `/home/jay/projects/InsuRo/src/pages/AdminSubscriptions.tsx`

변경사항:
1. Plan 타입에 `is_public` 필드 추가
2. 플랜 생성/수정 폼에 "공개 여부" Switch 추가
3. 플랜 카드에 히든플랜 표시 (Badge: "비공개" or "히든")

### 5. Supabase types 업데이트

`is_public` 컬럼 추가 후 types.ts에도 반영:
파일: `/home/jay/projects/InsuRo/src/integrations/supabase/types.ts`

subscription_plans의 Row/Insert/Update에 `is_public: boolean` 추가.

### 6. 검증
- DB: subscription_plans에서 6개 플랜 조회 확인 (5개 public + 1개 hidden)
- AdminSubscriptions 페이지: 6개 모두 표시, Internal에 "비공개" 뱃지
- PlanUpgradeDialog: 5개만 표시 (Internal 안 보임)

## 수정 파일 목록
1. DB: subscription_plans ALTER TABLE + INSERT
2. `/home/jay/projects/InsuRo/src/components/PlanUpgradeDialog.tsx`
3. `/home/jay/projects/InsuRo/src/pages/AdminSubscriptions.tsx`
4. `/home/jay/projects/InsuRo/src/integrations/supabase/types.ts`

## 레벨: Lv.2
스키마 변경 + 프론트엔드 수정. 파일 4개 영향.