/keeper-out/admin/leads/[id]/ 신규 페이지를 만들어,
방금 박은 pain_points·pain_note +
매장·고객·사진·영업자·지급·이벤트 타임라인까지
한 화면에 펼치겠습니다. Phase 1(오늘)은 13섹션 중 8개만,
visit_logs / owner 다른 매장 / place 마스터는 Phase 2로 미루는 게 합리적입니다.
스코프 동의 받으면 즉시 진입.
app/keeper-out/admin/AdminClient.tsx의 풀퍼널 list가
PipelineRow 한 줄짜리만 출력 중이고, 개별 lead의 detail view는 아예 없음:
// 현재 PipelineRow 한 줄
{lead.store_name} · {lead.business_no}
{lead.phone} · {lead.current_security} · {lead.camera_count}대 · {scenario benefit}
[🏬 매장] [📷 실사리드] [☎️ 콜매칭] [🚩 설치완료] // 4단계 진행 버튼
[💸 N페이 송금 대기] // payout pending시
즉 영업맨이 매장 방문 전 talking point 준비할 페이지가 없음. 자동님이 지금 만들자는 게 정확히 이 부분.
자동님 발화 verbatim — "페인포인트를 포함한 고객의 모든 데이터와 사진들이 다 포함되고 영업자가 누군지까지, 매장 데이터, 연락처, 지급 여부와 금액, 에이전트 1,2,3 항목들도". 이걸 DB 컬럼/테이블로 풀어보면:
| 요청 | 출처 | 특이사항 |
|---|---|---|
| pain_points (오늘 박음) | keeper_outbound_leads.pain_points | 6개 multi-select chip |
| pain_note (오늘 박음) | keeper_outbound_leads.pain_note | 자유 textarea, 인용 박스 |
| 고객 모든 데이터 | leads (15+ 컬럼) | 아래 04번 카드 참조 |
| 사진들 | leads.photo_urls text[] | Vercel Storage 버킷 keeper-out-photos |
| 영업자 1/2/3 | agent_1·agent_2·agent_3 (FK) | keeper_outbound_agents JOIN — 이름·전화·role 필요 |
| 매장 데이터 | leads + place_id JOIN places | place 마스터는 Phase 2 권장 |
| 연락처 | leads.phone | tel: 링크 |
| 지급 여부와 금액 | keeper_outbound_payouts JOIN | type별 합계 + 상태 |
자동님이 "음... 더 뭐있지?"라고 열어두셔서, 제가 떠올린 것 5건:
diagnose_submitted / naver_pay_sent_auto /
naver_pay_failed / installed 등 시간순.
이미 INSERT되고 있는데 표시되는 화면이 없음.
owner_id JOIN. 1점주 N매장이면
"이 사장님 매장 3개입니다" — 영업 효율 점프업.
경로: app/keeper-out/admin/leads/[id]/page.tsx + LeadDetailClient.tsx
| # | 섹션 | 주요 컬럼/테이블 | Phase |
|---|---|---|---|
| 1 | Hero (요약 + status pipeline) | store_name, status, scenario, expected_benefit, created_at | P1 |
| 2 | 고객 풀 데이터 | ceo_name, phone, business_no, naver_place_id, marketing_consent_at | P1 |
| 3 | 현재 보안 상황 | current_security, device_age, camera_count, monthly_fee, combined_isp | P1 |
| 4 | ★ Pain Points (핵심) | pain_points[], pain_note + 영업분기 매핑 | P1 |
| 5 | 사진 갤러리 | photo_urls[] 그리드 | P1 |
| 6 | 영업자 1/2/3 | agent_1/2/3 FK + agents JOIN | P1 |
| 7 | 지급/인센티브 | payouts JOIN — type/recipient/amount/status | P1 |
| 8 | 이벤트 타임라인 | funnel_events 시간순 | P1 |
| 9 | 방문 로그 | visit_logs JOIN | P2 |
| 10 | 점주 다른 매장 | owner_id JOIN — 동일 owner의 leads | P2 |
| 11 | 매장 마스터 | place_id JOIN places — 동네 폐업률·우선순위 | P2 |
| 12 | Status 이동 액션 | 기존 PATCH route 재사용 | P1 |
| 13 | 방문 메모 추가 | visit_logs INSERT 폼 | P2 |
선택된 chip만 컬러 강조. pain_note는 따옴표 인용 박스로 사장님 발화 재현.
현재 app/api/keeper-out/lead/[id]/route.ts는 PATCH만 있음.
GET 추가해서 lead + agents + payouts + funnel_events 한 번에 fetch:
export async function GET(req, { params }) {
const { id } = await params;
// PostgREST embed로 한 방에
const rows = await sbSelect(
"keeper_outbound_leads",
`select=*,
agent_1_data:keeper_outbound_agents!agent_1(id,name,phone,role),
agent_2_data:keeper_outbound_agents!agent_2(id,name,phone,role),
agent_3_data:keeper_outbound_agents!agent_3(id,name,phone,role),
payouts:keeper_outbound_payouts(*),
events:keeper_outbound_funnel_events(*)
&id=eq.${id}`
);
return NextResponse.json({ ok: true, lead: rows[0] });
}
visit_logs 등 추가될 때 같은 패턴으로 확장.| Phase | 스코프 | 예상 시간 | 커밋 단위 |
|---|---|---|---|
| P1 — 오늘 | 섹션 1·2·3·4·5·6·7·8·12 (9개) + GET endpoint + AdminClient 클릭 이동 | ~2시간 | 3 commits (route / detail page / link) |
| P2 — 다음 세션 | 섹션 9·10·11·13 (visit_logs / owner / place / 메모 추가) | ~3시간 | 별도 보고서 |
feedback_diagnose_design_isolation에 따라 /keeper-out/admin은
영업원 컨텍스트라 키퍼 오렌지 톤. 이번에 청록(#009090)으로 안 박음. 보고서만 청록.
keeper_outbound_payouts · funnel_events는 service_role만 SELECT
가능 (anon 차단). 이미 lib/keeper-out/supabase.ts가 service_role key 쓰니 OK.
keeper-out-photos bucket이 public이라 URL 직접 노출 OK. 단 admin이
배포 후 외부에 떠다니지 않게 (/keeper-out/admin/* 라우트 가드 필요 여부 →
현재 가드 없음, 별도 결정 필요).
아래 셋 중 하나로 회신 주시면 즉시 진입:
어제 박은 pain_points 백엔드 commit 여부도 같이 결정하시면 좋아요 (P1 진입 전 staging에 박는 게 안전 — DB 컬럼은 이미 박혀있어서).
feedback_diagnose_design_isolation.md — admin은 키퍼 오렌지/admin/* + outbound-recorder BFF