# InsuRo Phase J 구현: 개인정보 동의 관리 + 고객 활동 타임라인

## 개요
InsuRo CRM의 Phase J 2개 기능을 구현한다.
- 프로젝트 경로: `/home/jay/projects/InsuRo/`
- 기존 고객 데이터 없음 (초기화 예정). 마이그레이션 호환성 걱정 불필요.
- Supabase 새 프로젝트 사용 중: `zayhfjuwviporbzokudr.supabase.co`
- DB 마이그레이션은 SQL 파일로 작성만 할 것 (직접 실행 불가, 제이회장님이 SQL Editor에서 수동 실행)

## 환경 참고
- Supabase 키: `source /home/jay/workspace/.env.keys` → `INSURO_NEW_*` 변수들
- 타입 정의: `src/integrations/supabase/types.ts`
- 고객 테이블: `public.customers` (types.ts 570~638줄 참조)
- 기존 RLS 패턴: agent_id 기반 (에이전트가 자기 고객만 CRUD)
- git user: `JonghyukJeon <jonghyuk.jeon@gmail.com>`

## 작업 1: 개인정보 동의 관리

### 1-1. DB 마이그레이션 SQL 작성
파일: `supabase/migrations/20260309_phase_j_consent.sql`

테이블: `customer_consents`
```sql
CREATE TABLE public.customer_consents (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  customer_id UUID NOT NULL REFERENCES public.customers(id) ON DELETE CASCADE,
  agent_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
  consent_type TEXT NOT NULL,        -- '개인정보수집', '마케팅', '제3자제공', '민감정보처리'
  status TEXT NOT NULL DEFAULT '동의', -- '동의', '거절', '철회', '만료'
  consent_date TIMESTAMPTZ NOT NULL DEFAULT now(),
  expiration_date TIMESTAMPTZ,       -- NULL이면 무기한
  consent_method TEXT DEFAULT '온라인', -- '온라인', '서면', '구두'
  document_version TEXT,              -- 동의서 버전 (예: 'v1.0')
  notes TEXT,
  created_at TIMESTAMPTZ DEFAULT now(),
  updated_at TIMESTAMPTZ DEFAULT now()
);

-- RLS: 기존 패턴과 동일 (agent_id 기반)
-- 인덱스: customer_id, (customer_id, consent_type)
```

### 1-2. 프론트엔드 컴포넌트
- 고객 상세 페이지에 **"개인정보 동의"** 탭 또는 섹션 추가
- 위치: 기존 고객 상세 화면 내 (CrmCustomers.tsx 또는 관련 컴포넌트 확인)
- 기능:
  - 동의 항목 목록 표시 (체크리스트 형태)
  - 동의/철회 토글
  - 동의 이력 조회
  - 새 동의 추가 모달
- 4가지 동의 유형 기본 제공: 개인정보수집(필수), 마케팅(선택), 제3자제공(선택), 민감정보처리(선택)
- 상태 뱃지: 동의(초록), 거절(빨강), 철회(회색), 만료(노랑)

### 1-3. types.ts 업데이트
- `customer_consents` 테이블의 Row/Insert/Update 타입 추가
- 기존 types.ts 패턴 따라서 추가

## 작업 2: 고객 활동 타임라인

### 2-1. DB 마이그레이션 SQL 작성
같은 파일 또는 별도 파일: `supabase/migrations/20260309_phase_j_timeline.sql`

테이블: `customer_activities`
```sql
CREATE TABLE public.customer_activities (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  customer_id UUID NOT NULL REFERENCES public.customers(id) ON DELETE CASCADE,
  agent_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
  activity_type TEXT NOT NULL,  -- 'note', 'call', 'message', 'stage_change', 'insurance', 'ai_summary', 'todo', 'consent'
  title TEXT NOT NULL,          -- 간단한 설명 ("메모 추가", "통화 5분", "스테이지: 상담중→제안서발송")
  detail JSONB,                 -- 유연한 추가 데이터 (이전 스테이지, 통화 시간 등)
  related_table TEXT,           -- 'customer_notes', 'customer_call_logs' 등
  related_id UUID,              -- 원본 레코드 ID
  created_at TIMESTAMPTZ DEFAULT now()
);

-- RLS: agent_id 기반
-- 인덱스: (customer_id, created_at DESC)
```

### 2-2. 활동 자동 기록 로직
- 기존 CRM 동작에서 활동이 발생할 때 `customer_activities`에 자동 INSERT
- 방법: Supabase DB 트리거 또는 프론트엔드에서 INSERT 시 함께 기록
- **프론트엔드 방식 권장** (트리거는 SQL Editor 수동 실행 필요):
  - 메모 추가 시 → activity 기록
  - 통화 기록 저장 시 → activity 기록
  - 스테이지 변경 시 → activity 기록
  - 보험 정보 추가/수정 시 → activity 기록
  - AI 분석 실행 시 → activity 기록
  - 동의 상태 변경 시 → activity 기록 (작업 1과 연동)
- 유틸 함수 하나 만들어서 재사용: `logCustomerActivity(customerId, agentId, type, title, detail?, relatedTable?, relatedId?)`

### 2-3. 프론트엔드 타임라인 컴포넌트
- 고객 상세 페이지에 **"활동 타임라인"** 탭 또는 섹션
- UI:
  - 세로 타임라인 (최신순)
  - 활동 유형별 아이콘/색상 구분
  - 날짜 구분선
  - 활동 유형 필터 (전체, 메모, 통화, 메시지, 스테이지, 보험, AI 등)
  - 무한 스크롤 또는 페이지네이션 (20건씩)
- shadcn/ui 컴포넌트 활용 (기존 프로젝트 스타일 준수)

## 작업 3: AdminCrmConfig 상태 업데이트
- `src/pages/AdminCrmConfig.tsx`에서 Phase J 상태를 `planned` → `active`로 변경
- 개인정보 동의 관리 FeatureRow의 status도 `planned` → `active`

## 검증 기준
- [ ] `npm run build` 성공 (0 에러)
- [ ] `npx tsc --noEmit` 타입 체크 통과
- [ ] 마이그레이션 SQL 파일이 supabase/migrations/ 에 생성됨
- [ ] types.ts에 customer_consents, customer_activities 타입 추가됨
- [ ] 동의 관리 UI가 고객 상세에 표시됨
- [ ] 타임라인 UI가 고객 상세에 표시됨
- [ ] logCustomerActivity 유틸이 기존 CRM 동작에 연동됨
- [ ] git commit 완료

## 주의사항
- DB 마이그레이션 SQL은 파일 생성만! `supabase db push`나 직접 실행 하지 말 것.
- 기존 customers 테이블의 `privacy_consent_at` 필드는 그대로 둘 것 (하위 호환)
- shadcn/ui + Tailwind CSS 기존 스타일 유지
- 한국어 UI
