신청 현황 플로우
어드민 10번 메뉴 (show(6)) · 모든 유입 경로 통합 뷰 · CRM 양방향 실시간 동기화
핵심 -- 모든 유입 경로 통합
신청 현황 = 플랫폼 발생 + 외부 발생 모든 신청을 하나의 화면에서 관리.
플랫폼(셀프신청/티켓/AI채팅) -> 어드민 -> CRM 동기화 / 외부(CRM등록) -> CRM -> 어드민 역동기화.
전화번호 = 핵심 키 (중복 방지 + 자동 매칭 + 회원/비회원 구분)
플랫폼 발생 (어드민->CRM)
셀프신청 / 티켓 / AI채팅
고객이 앱/웹에서 직접 신청
-> bongi_applications 저장 (중고폰 매입 제외 — 별도 bongi_used_phone_buyback)
-> CRM으로 자동 푸시
외부 발생 (CRM->어드민)
CRM 등록 (전화 인입 등)
상담사가 CRM에 직접 등록
-> 어드민으로 실시간 역동기화
-> 티켓번호 없음 (상담 시 확정)
양방향 동기화
상태 변경: CRM <-> 어드민 실시간
신청완료 -> 상담중 -> 계약완료/취소
어느 쪽에서든 변경 -> 양쪽 반영
동기화 방향 컬럼으로 추적
↓
STEP 1 -- 유입 경로 3가지
신청이 만들어지는 3가지 경로
경로 1 셀프신청 (POST /api/applications)
고객
상품 탐색
->
셀프신청
이름+전화+상품
->
POST /applications
입력검증
->
bongi_applications
type: 'self'
channel: 'web'
->
CRM 동기화
(어드민->CRM)
server/routes/applications.js -- 전화번호 필수, 형식 검증 (/^01[016789]-?\d{3,4}-?\d{4}$/), 이름 50자/메시지 2000자 제한.
Supabase + 로컬 배열 양쪽 저장. Mock 고객 DB에도 추가 (어드민 CRM에서 즉시 표시).
경로 2 AI채팅 / 티켓 (createLead / requestCallback)
고객
AI 채팅
->
createLead()
or requestCallback()
->
bongi_applications
type: 'ai_chat' / 'callback'
channel: 'ai_chat'
->
Mock 고객 DB
source: 'kakao_chat'
->
CRM 동기화
(어드민->CRM)
server/services/chat-tools.js -- AI 채팅 도중 상담 신청(createLead) 또는 콜백 요청(requestCallback).
product_id(티켓번호) 포함 가능. form_data에 message/preferred_time 저장.
경로 3 CRM 등록 (외부 발생)
전화 인입
(콜센터)
->
상담사
CRM에 직접 등록
->
어드민 역동기화
(CRM->어드민)
->
bongi_applications
sync: 'CRM->어드민'
티켓번호: 없음
CRM 등록 건은 티켓번호 없음 (상담 진행 중 상품 확정 시 부여).
동기화 방향이 CRM->어드민으로 표시됨.
| 유입경로 | API | type 값 | channel 값 | 동기화 방향 | 티켓번호 |
| 셀프신청 | POST /api/applications | self / call | web | 어드민->CRM | 있음 (product_ticket) |
| AI채팅 | createLead() / requestCallback() | ai_chat / callback | ai_chat | 어드민->CRM | 있을 수 있음 |
| CRM등록 | CRM 직접 입력 | - | - | CRM->어드민 | 없음 (상담 시 확정) |
↓
STEP 2 -- 어드민 <-> CRM 양방향 동기화
동기화 방향에 따른 데이터 흐름
어드민 -> CRM (플랫폼 발생)
고객 신청
(셀프/AI채팅)
->
bongi_applications
저장
->
CRM에
자동 푸시
- Mock 고객 DB에도 동시 추가
- 상담사 배정은 CRM 영역
- 어드민에서는 동기화만 관리
CRM -> 어드민 (외부 발생)
전화 인입
CRM 등록
->
CRM에서
어드민 푸시
->
bongi_applications
역동기화
- 티켓번호 없음 (상담 시 확정)
- 상품명은 "인터넷+TV (미정)" 등
- 상태 변경도 실시간 동기화
핵심 원칙: 상담사 배정은 CRM 영역 -- 어드민에서는 동기화만 관리.
전화번호 = 매칭 키: 플랫폼 회원이면 "앱회원", 미가입이면 "비회원"으로 자동 분류.
↓
STEP 3 -- 신청 상태 전이
bongi_applications.status 상태 전이도
| 상태 | 의미 | 전이 가능 | 트리거 |
| 신청완료 |
고객 신청 접수됨 (상담사 미배정) |
상담중 |
신청 API 호출 시 자동 (status: '신청완료') |
| 상담중 |
상담사 배정, 상담 진행 중 |
계약완료 / 취소 |
CRM에서 상담사 배정 시 |
| 계약완료 |
계약 성사 (현금 페이백/포인트 후속 처리 시작) |
- (최종 상태) |
CRM에서 계약 체결 확인 시 |
| 취소 |
고객 또는 상담사에 의해 취소 |
- (최종 상태) |
상담 불발 / 고객 거부 |
DB 허용값: 신청완료, 상담중, 계약완료, 취소 (전부 한글)
↓
STEP 4 -- 어드민 신청현황 화면 (10번)
KPI 카드
필터 3줄
상태
전체
신청완료
상담중
계약완료
취소
경로
전체
셀프신청
티켓
CRM등록
유형
전체
앱회원
비회원
이름 / 전화번호 / 티켓번호 검색
테이블 컬럼 (11개)
| 신청일시 | 고객명 | 연락처 | 유형 | 유입경로 | 동기화 | 티켓번호 | 상품 | 현금 페이백 | 상태 | 관리 |
| 2026-04-06 14:23 |
홍길동 |
010-1234-5678 |
앱회원 |
셀프신청 |
어드민->CRM |
SK0188 |
SKT 500M+Btv이코노미+AI NUGU+WiFi6 |
43만 |
신청완료 |
상세 |
| 2026-04-06 12:40 |
박민수 |
010-4567-8901 |
비회원 |
CRM등록 |
CRM->어드민 |
- |
KT 인터넷+TV (미정) |
- |
상담중 |
상세 |
| 2026-04-06 13:12 |
이영희 |
010-3456-7890 |
비회원 |
셀프신청 |
어드민->CRM |
LG0079 |
LG U+ 500M+프리미엄+UHD4+기가와이파이6 |
47만 |
계약완료 |
상세 |
200건 limit · 상태/경로/검색어 필터 · 고객명 클릭 -> 회원 상세 모달 (findAndOpenMember)
API
| Method | Path | Query Params | 설명 |
| GET | /api/admin/platform/applications | status, channel, search | 신청 목록 조회 (200건 limit, created_at DESC) |
| POST | /api/applications | - | 셀프 신청 접수 (name, phone, productTicket, message, channel) |
admin-platform.js GET /applications: status/channel/search 쿼리 파라미터 지원.
search는 name.ilike / phone.ilike / ticket_no.ilike OR 조건 검색.
고객명 클릭: findAndOpenMember() 호출 -> 회원관리(08번) 상세 모달 열기.
↓
STEP 5 -- 마이페이지 신청 내역 (고객 UI)
client/src/pages/my/Applications.jsx
필터:
전체
진행중
완료
취소
신청일 2026.04.01 · 셀프 신청
담당: 김상담
현금 페이백 37만원
신청일 2026.02.15 · AI 채팅
현금 페이백 15만원 지급완료
| 카드 필드 | 데이터 | 비고 |
| 상품명 | title | 상품 이름 (예: KT 인터넷+TV 500Mbps) |
| 신청일 | date | YYYY.MM.DD 형식 |
| 유입경로 | type | 셀프 신청 / AI 채팅 / 티켓 K227 |
| 상태 | status | 상담중 / 계약완료 / 취소 / 검수중(중고폰) |
| 담당자 | extra | "담당: 김상담" (배정된 경우) |
| 현금 페이백 | gift | "현금 페이백 37만원" / "현금 페이백 15만원 지급완료" |
| 중고폰 | buyback | 중고폰 매입 신청일 경우 매입가+진행 단계 표시 |
중고폰 매입 신청: 별도 진행 단계 표시 (신청완료 -> 검수중 -> 매입확정 -> 완료), 매입 예정가 표시.
취소 건: opacity: 0.6 으로 흐리게 표시.
↓
STEP 6 -- 계약완료 후 흐름
계약완료 시 자동 트리거되는 3가지
1. 현금 페이백 자동 생성
계약완료 -> 현금 페이백 관리(13번)에
"지급 대기" 건 자동 생성
앱회원: 본인인증 + 계좌 등록 완료 시 즉시 지급
비회원: "비회원 대기" 상태 -> 앱 가입 유도
현금 페이백 = 전액 현금 지급
2. 포인트 자동 적립
앱회원만 적립 가능 (비회원 불가)
| 친구초대 계약 (추천인) | 인터넷15K / TV20K / 렌탈10K |
| 친구초대 계약 (친구) | 인터넷10K / TV15K / 렌탈5K |
| 후기 작성 | 15,000P |
3. 비회원 알림톡 자동 발송
3단계 자동 발송:
1차: 신청 완료 즉시
"앱 가입 + 계좌 등록 시 현금 페이백 즉시 지급"
2차: 계약 완료 시
"현금 페이백 OO만원 준비됨 -> 앱 가입 -> PASS 인증 -> 계좌 등록 -> 즉시 입금"
3차: D+7 (미가입 시)
"현금 페이백이 아직 대기 중이에요"
계약완료 전체 후속 처리 플로우
계약완료
->
현금 페이백 "지급 대기" 자동 생성 (13번)
포인트 자동 적립 (앱회원만, 14번)
비회원 알림톡 2차 발송
마이페이지 상태 반영
↓
예외 케이스
| 예외 | 상황 | 처리 |
| 전화번호 중복 |
같은 번호로 여러 번 신청 |
bongi_applications에 복수 행 허용 (건별 관리). Mock 고객 DB는 phone 기준 중복 체크 -> 기존 고객이면 추가하지 않음. |
| 전화번호 형식 오류 |
01x-xxxx-xxxx 형식이 아닌 입력 |
400 에러 반환: "전화번호 형식이 올바르지 않습니다" |
| Supabase 연결 실패 |
DB 접속 불가 |
로컬 배열(localApplications)에 저장 후 정상 응답 (201). 조회 시도 로컬 배열 fallback. |
| 비회원 현금 페이백 지급 |
계약완료 후 비회원이 앱 가입하지 않음 |
"비회원 대기" 상태 유지. 알림톡 3차(D+7)까지 자동 발송. 이후 수동 일괄 알림톡 발송 가능. |
| CRM등록 건 티켓 없음 |
외부 유입이라 상품 미확정 |
티켓번호 "-" 표시. 상품명은 "인터넷+TV (미정)" 등. 상담 진행 중 상품 확정 시 티켓번호 부여. |
| 입력값 제한 초과 |
이름 50자 초과 / 메시지 2000자 초과 |
400 에러 반환 (server/routes/applications.js 검증) |
Supabase 저장 실패 시 silent fallback: console.warn만 출력하고 로컬에 저장하여 서비스 중단 없음.
Mock 고객 DB 추가: 어드민 CRM 화면에서 즉시 확인 가능하도록 customers 배열에 unshift.
↓
DB -- bongi_applications 테이블 구조
| 컬럼 | 타입 | 설명 | 예시 값 |
| id | uuid PK | 자동 생성 | a1b2c3d4-... |
| type | text | 신청 유형 | self / ai_chat / callback / call |
| name | text | 고객명 | 홍길동 |
| phone | text | 연락처 (핵심 키) | 010-1234-5678 |
| user_type | text | 고객 유형 | 앱회원 / 비회원 |
| channel | text | 유입 채널 | web / ai_chat |
| sync_direction | text | 동기화 방향 | 어드민->CRM / CRM->어드민 |
| product_ticket | text | 티켓번호 (FK 참조) | SK0188 / R015 / null |
| product_name | text | 상품명 | SKT 500M+Btv이코노미+AI NUGU+WiFi6 |
| gift_amount | integer | 현금 페이백 금액 (원) | 430000 |
| form_data | jsonb | 추가 데이터 | { message: "...", source: "chat_ai" } |
| status | text | 신청 상태 | 신청완료 / 상담중 / 계약완료 / 취소 / new |
| created_at | timestamptz | 생성일시 | 2026-04-06T14:23:00Z |
연관 테이블
bongi_applications
->
bongi_tickets (product_ticket -> ticket_number)
bongi_user_profiles (phone 매칭 -> 앱회원/비회원 판별)
bongi_gifts (계약완료 -> 지급대기 자동 생성)
bongi_points (앱회원 포인트 적립)
phone = 핵심 매칭 키: bongi_user_profiles.phone과 매칭하여 앱회원/비회원 자동 판별.
product_ticket: bongi_tickets.ticket_number 참조. CRM등록 건은 null.
form_data: 채팅 메시지, 콜백 희망 시간 등 자유 형식 JSON 저장.
관련 URL 및 소스 파일
| 구분 | 경로 | 설명 |
| 어드민 | https://bongi-mobile-production.up.railway.app/admin/ | 10 신청현황 |
| GitHub | https://github.com/vinsenzo83/bongi-mobile | 소스코드 |
| 어드민 UI | server/public/admin/index.html (1600~1698줄) | show(6) 신청현황 렌더 |
| 어드민 API | server/routes/admin-platform.js (578~592줄) | GET /applications |
| 신청 API | server/routes/applications.js | POST /applications |
| AI 채팅 | server/services/chat-tools.js (814~907줄) | createLead / requestCallback |
| 마이페이지 | client/src/pages/my/Applications.jsx | 고객 신청 내역 UI |
| 티켓 플로우 | docs/flow-ticket.html | 티켓 관리 (09번) |
| 데이터 플로우 | docs/data-flow-diagram.html | 전체 데이터 흐름도 |
봉이모바일 · 신청 현황 플로우 · 2026-04-09
관련: 현금 페이백 관리(13번) / 포인트 관리(14번) / 티켓 관리(09번)