📞 봉이 TM CRM 통합 플로우
incentive-admin.html · 4 role · 18 menu · 광주센터 콜DB 영업 전담
🎯 TM CRM SYSTEM
광주 콜센터 TM 영업 → 견적 → 계약 → 정산 통합 시스템
매장 영업과 별개 · 인터넷·TV·렌탈 전담 · 인센티브 V5 자동 정산 · 26+ incentive_* 테이블
열기 →
3,113
콜DB active (2026-04)
STEP 0 — 사용자 역할 (4 role) · 권한별 메뉴 자동 노출
TM CRM의 4가지 역할 — 본사 vs 광주센터 분리
🔴 admin
소속:
본사
권한:
전체
시드·룰·DB import·rollback
예:
빈센조
🟠 manager
소속:
광주센터
권한:
본인 센터
분배 승인·정산·목표
예:
박매니저
🔵 agent
소속:
광주센터 (5명)
권한:
본인 분배만
콜·메모·계약 등록
예:
김상담·이상담·최상담·홍상담·김상담2
🟣 contract
소속:
본사
권한:
전체 (콜·분배 X)
서류·설치 일정·후속
예:
고혜인·최계약
매장 vs 콜센터 분리: 8개 매장 상담사(봉이·송이·상무·홍이·순천·목포·여수·익산)는 매장 휴대폰 개통 전담이며 TM CRM 접근 X.
콜센터 상담사(광주센터 5명)는 인터넷·TV·렌탈 부가 영업 전담. 휴대폰 권유 차단 룰 적용.
↓
🔄 시스템 흐름 총정리 (DB 라이프사이클 한눈에)
하나의 콜DB가 정산까지 가는 전체 경로 — 누가·언제·어떤 API·어떤 DB 변화
| STEP | 사용자 액션 | API · 트리거 | DB 변화 (테이블 · 컬럼) | 다음 단계 조건 |
| 1 |
마감원장 import / 광고 인입 |
POST /api/customer-db/import RPC calc_customer_grade + calc_age_bonus |
incentive_customer_db INSERT (call_status=null) quality_grade · priority_score 자동 |
active=true · 미배정 풀 진입 |
| 2 |
manager: 분배 (지정 or 균등) |
POST /distribute POST /distribute/equal 또는 RPC approve_distribution_request |
incentive_customer_db UPDATE assigned_agent_id · assigned_at |
agent.내 콜 리스트에 표시 |
| 3 |
agent: TM 콜 (큐콜 또는 수동) |
POST /api/incentive/customer-call-log PATCH /customer-db/:id (call_status·notes·callback_at) |
incentive_customer_call_log INSERT incentive_customer_db UPDATE call_status · last_contacted_at |
call_status=converted → STEP 5 callback → STEP 3 재진입 rejected → retention (30일 후 archive) |
| 4 |
agent: 견적 계산 (client-side) |
D 객체 read · LS·DB sync via _calc-data-sync.js |
(DB 변화 없음 · 어드민 #16에서 시드 편집 시만 UPSERT) |
견적 결과 → STEP 5 모달 prefill |
| 5 |
agent: 계약 완료 클릭 |
POST /api/incentive/sales |
incentive_sales INSERT (status=pending + payback_snapshot 박제 + point_weight_snapshot) incentive_customer_db UPDATE call_status=converted |
contract role에 인계 |
| 6 |
contract: 서류·통신사 등록·설치 협의 |
PATCH /api/incentive/sales/:id (status·결합·납부·메모 등 전부) + cron card-masking (03:30 KST 매일) |
incentive_sales UPDATE status · contract_*_at UPDATE customer_address · payment_extra UPDATE card_masked_at (7일 경과) |
status=completed → STEP 7 집계 대상 |
| 7 |
cron 자동 (매월 1일 02:00) 또는 admin 수동 |
RPC incentive_calc_monthly_settlement (agent_id, year_month) POST /settlements/run (admin) |
incentive_settlements UPSERT (status=draft) + 상담사 포인트·Grade·페널티·보너스·페이백 분담 자동 |
admin: locked → paid 전환 |
incentive_customer_db
①분배
분배 풀 (agent)
③콜
customer_call_log
⑤계약
incentive_sales
⑦정산
incentive_settlements
자동 트리거 5종 (cron):
• 매월 1일 02:00 — 인센티브 월별 정산 (incentive_settlement.js)
• 매일 03:00 — customer-db retention (converted 90일·rejected 30일·archive·purge)
• 매일 03:30 — 카드정보 마스킹 (계약완료 +7일)
• 매일 04:00 — customer-db 재배정 (미컨택 7일·저활성 14일 풀 복귀)
• 매일 09:00 — 공시지원금 크롤링 (subsidy-crawler)
핵심 상태 전이:
• incentive_customer_db.call_status: null → assigned → contacted → converted | callback | rejected | no_answer
• incentive_sales.status: pending → in_progress → completed (또는 cancelled)
• incentive_settlements.status: draft → locked → paid
↓
STEP 1 — 콜DB 수집·자동 등급화 (incentive_customer_db)
출처별 DB 수집 → RPC가 자동 등급·나이가중치 부여
광고 인입
마감원장 import (월 1회)
외부 DB
콜 후 retention
→
incentive_customer_db
+ calc_customer_grade()
+ calc_age_bonus()
→
S/A/B/C 등급 자동
⭐⭐⭐ S급
priority
100
tier=1 +
이동
최우선 분배
2026-04:
565명
⭐⭐ A급
priority
80 / 50
tier=1 신규 OR
tier=2 렌탈권유
2026-04:
497명
⭐ B급
priority
30
tier=1 +
기변
기변 권유
2026-04:
2,035명
C급
priority
10
그 외 (옛 customer)
참고용
2026-04:
15명
나이 가중치 (priority_score에 추가): 30~40대 +25 ⭐ 최적 / 20대 +20 / 50대 +15 / 60대 0 / 70+ -30
마감원장 import 룰: 워치(L*) 제외 · 미성년·100세 이상 제외 · 이름+생년월일 키로 통합 (한 사람 여러 회선 → 1건)
↓
STEP 2 — DB 분배 (hybrid) · 메뉴 #07·#13 · manager·admin
2가지 분배 방식 — 지정 (manager 직접) · 균등 (1클릭 자동)
1️⃣ 지정 분배 POST /distribute
manager/admin이 직접 선택:
• batch (마감원장·광고 등)
• 등급 (S/A/B/C 멀티 선택)
• 상담사 (광주센터 active)
• 1인당 max 건수
→
라운드로빈 분배
2️⃣ 균등 분배 POST /distribute/equal
1 클릭 자동:
• active agent 자동 조회
• 미배정 풀 (priority DESC)
• 라운드로빈 자동
• manager: 본인 센터 강제
• admin: 전체 가능
agent 분배 요청
→
manager 승인 (#13)
→
approve_distribution_request RPC
→
S→A→B→C 우선순위 자동
분배 후 retention: 미컨택 7일·저활성 14일 → 풀 자동 복귀 (재배정 cron 매일 04:00 KST)
↓
STEP 3 — TM 큐콜 (메뉴 #12·#14·#15) · agent
사이드바 가로 카드 list + 좌측 fixed 풍부 카드 + 견적·스크립트
📋 내 콜 리스트 (#12)
→
📞 TM 상담 v1 큐콜 (#14)
또는
✏️ TM 상담 v2 수동 (#15)
고객 카드 표시
이름 · tier 배지 · 전화
🎯 1차/2차 권유 자동 분기
마감원장 정보 (개통·단말·요금)
🌐 인터넷 청취 결과
통화 이력
스크립트 6단계
① 인사
② 사용 상품 파악
③ 니즈 파악
④ 견적 안내
⑤ 결합 혜택 강조
⑥ 클로징
콜 종료 직후
통화 요약 텍스트
필수
call_status 분기:
converted·callback·rejected
callback_at 설정
메모 (특이사항)
봉이 콜센터 룰: CTI/녹음 시스템 미연동 · 상담사가 직접 발신·수신 · 통화 요약 텍스트가 유일 증거.
차단 룰: 휴대폰 권유 X (매장 전담) · 인터넷+TV 같은 통신사 기변 X (3사 공통)
↓
STEP 4 — 견적 계산 (메뉴 #16 TM 데이터 관리 ↔ #14/#15)
3사 통신사 · 결합 8종 · 인센티브 V5 미리보기
🧮 TM 데이터 관리 (#16)
calculator.html?admin=1
시드 8 카테고리
LS + Supabase
자동 sync
TM 상담 v1/v2 (#14/#15)
tm-counselor.html
시드 8 카테고리 (어드민 편집)
1. 인터넷·WiFi (+LGU+ 500M↑ 기본 제공)
2. TV 상품 (+TV 추가 정책 3사)
3. 셋톱박스 (+discountRules)
4. 결합할인 8종
5. 설치비
6. 제휴카드
7. 영업포인트
8. 사은품 (63 카탈로그)
결합할인 8종
SKT 요즘가족결합 · 온가족할인
KT 총액·정액·프리미엄 가족·프리미엄 싱글
LGU+ 참쉬운 가족·투게더
D[carrier].bundle.*
카탈로그 dc + 자격 조건 자동
계산기 견적 결과
+
💰 인센티브 V5 미리보기
동기화 4단: storage event · 60초 polling · visibilitychange · BroadcastChannel('incentive-products')
→ 어드민 편집 즉시 모든 견적 탭 자동 반영
인센티브 V5 미리보기: agent 화면(P·우수·Tier만, 마진 숨김) vs admin 화면(+마진·Grade 단가)
↓
STEP 5 — 계약 접수 (메뉴 #02 계약 처리) · incentive_sales
상세 모달 — 7개 섹션 통합 입력 + 시점 스냅샷 박제
agent: 계약 완료 클릭
→
POST /sales
→
incentive_sales (status=pending)
→
contract 인계
📦 상품 정보 (read-only)
통신사·종류·속도·TV 등급
상담사 포인트·Tier·우수상품
페이백 SNAPSHOT
payback_snapshot
👤 고객 정보
이름·전화·생년월일·주민
주소 (Daum 검색)
설치 일정·일시·입주 형태
🔗 결합·청구·납부
결합유형 (carrier 자동 필터)
결합 구성원 JSON
청구서 방식·번호·통신사
납부방법별 추가정보:
• 자동이체: 은행·예금주·계좌
• 카드이체: 명의자·카드사·번호·유효기간
👥 댁내 대기자·판매자
댁내 대기자 성함
대기자 전화
판매자 전화
🏦 사은품 입금 정보
예금주·은행·계좌
bank_account_*
현금 페이백용
🚦 상태 + 메모
pending → in_progress → completed
cancellation_reason
상담사 메모 / 계약부서 메모
DB 출처 필수 (completed 시)
카드정보 자동 마스킹: 계약완료 + 7일 경과 시 cron(매일 03:30 KST)이 자동 마스킹 (••••-••••-••••-1234).
7일 동안 운영팀이 통신사 자동이체 등록 처리 → 이후 평문 보관 차단.
↓
STEP 6 — Contract 후속 처리 (contract role · 메뉴 #02)
서류·설치 일정·승인 → 통신사 등록·사은품 지급
contract: 서류 확인
→
통신사 자동이체 등록
→
설치 일정 협의
→
status=in_progress → completed
→
사은품·페이백 지급
자동 트리거
contract_pending_at
contract_in_progress_at
contract_completed_at
contract_cancelled_at
PATCH /sales/:id
사은품 지급 방식
인터넷+TV 결합 →
즉시지급
• 현금 → 사은품 입금 계좌
• 가전 → 직배송
• 제로렌탈 → 1개월 후 소유권 이전
취소·환불
cancellation_reason 기록
cancelled_at 자동
pending 단계만 product 변경 가능
(등록 시점 snapshot 보호)
↓
STEP 7 — 정산 (V5 룰) · 메뉴 #09·#11 · cron 매월 1일
RPC incentive_calc_monthly_settlement · 자동 cron + 수동 집계 · draft → locked → paid
incentive_sales (계약완료)
→
RPC incentive_calc_monthly_settlement
→
incentive_settlements
→
CSV / 인쇄 / 지급
상담사 포인트 + Grade
상담사 포인트: 단독
1.0P / 결합
1.5P
Grade:
• G1 (0~15P) → 건당
2만
• G2 (16~30P, 우수 5건+) →
3만
• G3 (31P+, 우수 10건+) →
4만
페널티: 우수 미달 → 한 단계 강등
보너스 + 페이백
우수상품 보너스: 마진 25만+ →
+1만/건
페이백 분담:
• 회사 ≤
30,000
• 상담사 30,001~
50,000
기본급:
230만
cron: 매월 1일 02:00 KST
상태 전환: draft → locked (manager·admin) → paid (지급 완료)
· 월간 목표 (#10): agent별 콜·전환·P 목표 + 진척률 게이지 (70%/100% 단계 색상)
↓
FINAL — 어드민 사이드바 메뉴 18개 (incentive-admin.html)
| # | 메뉴 | 경로 | 주요 DB·도메인 | 주 사용자 |
| 01 | 대시보드 | incentive-dashboard.html | 전체 집계·차트 5종·실시간 콜 위젯 | admin manager |
| 02 | 계약 처리 | incentive-contract.html | incentive_sales | contract admin |
| 03 | 상담사 관리 | incentive-agents.html | incentive_agents | admin manager |
| 04 | 상품 관리 | incentive-products.html | incentive_products (63) | admin |
| 05 | 정책 관리 | incentive-rules.html | incentive_rules (V5) | admin |
| 06 | DB 출처 | incentive-db-sources.html | incentive_db_sources | admin |
| 07 | 콜 DB 관리 | incentive-customer-db.html | incentive_customer_db (3,113) | admin manager |
| 08 | 콜 통계 | incentive-call-stats.html | incentive_customer_call_log | admin manager |
| 09 | 월별 정산 | incentive-settlements.html | incentive_monthly_settlements | admin |
| 10 | 월간 목표 | incentive-goals.html | incentive_monthly_goals | admin manager |
| 11 | 상담사 ROI 비교 | incentive-agents-roi.html | 집계·ROI | admin |
| 12 | 내 콜 리스트 | incentive-call-list.html | 본인 분배 | agent |
| 13 | 분배 요청 | incentive-distribution-requests.html | incentive_distribution_requests | manager agent |
| 14 | TM 상담 v1 (큐콜) | tm-counselor.html | 견적·결합·계약 | agent |
| 15 | TM 상담 v2 (수동) | tm-counselor.html?mode=manual | 수동 모드 | agent |
| 16 | TM 데이터 관리 | calculator.html?admin=1 | 시드 8 카테고리 | admin |
| 17 | 급여 안내 | incentive-guide.html | V5 룰 설명 | 전체 |
| 18 | 사용 매뉴얼 | incentive-manual.html | 운영팀 매뉴얼 | 전체 |
부록 — 보안·환경·회귀 방어
🔒 보안
- JWT 인증 (incentive-auth-token-v1)
- RLS — incentive_* 26개 + bongi_* 41개 활성
- Sentry PII sanitize (카드·주민·계좌·휴대폰 자동 redact)
- 카드 마스킹 cron (계약완료 +7일)
- 2FA · IP allowlist · CSP · PIPA 보존
🌐 환경·배포
- 로컬: localhost:3001
- 데브: dev-admin.prexymarket.com (Supabase sesgdqbmophgmombelmn)
- 라이브: admin.prexymarket.com (Supabase dugaqvvnhsgenhmhuyju)
- 배포 7단계: 로컬 → 데브 → 데브 검증 → 라이브 신호 → 라이브 → 라이브 검증 → 교차 검증
- Railway 자동 빌드 (~90초) · Cloudflare CDN 캐시 우회
🧪 회귀 방어 E2E (Playwright)
| Suite | 시나리오 | 보호 대상 |
| sync-verify | 3 | 어드민 → 견적 동기화 (Bundle·Install·Default 폴백) |
| 04-quote-regression | 5 | D 객체 default · KT 프리미엄 싱글결합 · 설치비 · TV 상품 |
| 05-contract-flow | 3 | normalizeCarrier · 카드 마스킹 함수 · 모달 핵심 함수 |
| 합계 | 11 | 핵심 비즈니스 로직 자동 회귀 감지 |
🎬 실 시나리오 — 고객 김민수(45세·KT 100M) 콜DB 진입 → 정산까지
실제 운영 사례 1건이 시스템을 어떻게 통과하는지 단계별로
📥 2026-05-01 09:30 — DB 인입
마감원장 4월 import (admin·빈센조)
id: 12345
name: 김민수
birth: 1980-05-15 (45세)
phone: 010-1234-5678
tier: 1 (인터넷 회선)
category: 이동
매장: 봉이매장 / 호성판매
자동 등급: S급 (이동 + 30~40대 +25)
priority_score: 100 + 25 = 125
📤 09:35 — 분배 (manager 박매니저)
균등 분배 1클릭 (priority DESC 라운드로빈)
active agent: 김상담·이상담·최상담·홍상담·김상담2
priority 125 — 가장 높음 → 첫 자리
UPDATE incentive_customer_db
SET assigned_agent_id = 'agent-1' (김상담)
assigned_at = '2026-05-01T09:35'
10:15 김상담 콜
→
"봉이매장 호성씨께 KT 100M 가입하셨던 김민수 고객님 맞으시죠?"
→
현재 인터넷 청취: KT
기변 X
→ KT 외 통신사로 이동 권유 (예: SK 500M+B tv 올)
🧮 10:22 — 견적 (SK 500M + B tv 올)
통신사 SK / 속도 500M / WiFi 포함
─ 인터넷+TV ─
인터넷 28,600원 (+WiFi 1,100)
B tv 올 18,700원 - 결합할인 2,200 = 16,500
셋톱 스마트3 +4,400원
월 합계: 49,500원
─ 결합할인 ─
요즘가족결합 (휴대폰 결합)
─ 사은품 (즉시지급) ─
결합·500M·B tv 올 → 현금 470,000원
💰 인센티브 V5 미리보기 (agent 화면)
상품: SK 500M + B tv 올 (결합) · Tier S
상담사 포인트: 1.5P (결합)
우수상품: ✓ (마진 25만+ 가정)
이번 달 김상담 누적: 12건 = 18P
→ Grade G2 (16~30P) · 우수 5건+
→ 단가 3만/건
→ 1건 추가 시: +3만 + 우수 보너스 1만
예상 본 건 인센티브: 4만원
(페이백 47만 → 회사 30k + 상담사 17k 부담)
10:35 계약 완료 클릭
→
POST /api/incentive/sales
→
incentive_sales INSERT (status=pending)
→
contract 인계 (고혜인)
📋 14:00 — contract 처리
주소 입력 (Daum 검색): 광주광역시 ○○○
설치 일정: 2026-05-05 14:00
결합·청구·납부:
• 결합유형: SKT 요즘가족결합
• 청구서: 이메일
• 납부: 자동이체 (국민은행 김민수 ***-***)
사은품: 현금 47만 → 김민수 계좌 (즉시 입금)
status: in_progress
contract_in_progress_at = 2026-05-01T14:00
🔒 2026-05-08 03:30 — 카드 마스킹 (cron)
※ 자동이체라 카드정보 없음 → skip
(참고: 카드이체였다면 ↓)
contract_completed_at + 7일 < NOW()
+ payment_extra.card.number IS NOT NULL
→ 마스킹: 1234-5678-9012-3456 → ••••-••••-••••-3456
→ expiry: null
→ card_masked_at = NOW()
2026-05-05 설치 완료
→
status=completed
contract_completed_at
→
incentive_customer_db.call_status=converted
→
2026-06-01 02:00 — 정산 cron
→
김상담 5월 정산
(이번 건 +40,000원)
↓
🖥️ 핵심 화면 mockup (실 UI 흉내)
메뉴 #14 TM 상담 v1 (큐콜)
┌──────────────────────────────────────────┐
│ 📞 봉이 TM CRM [김상담 · ADMIN · 본사] │
├──────┬───────────────────────────────────┤
│ 📊대시│ 📞 TM 상담 v1 (큐콜) │
│ 📋계약│ │
│ ⚙️정책│ ┌────┬────┬────┬────┐ │
│ ... │ │S125│김민수│45세│010-1234│ ← 콜큐 │
│ 📞TMv1│ │이동│KT100M│봉이│호성 │ │
│ 📞TMv2│ ├────┴────┴────┴────┤ │
│ 🧮TM관│ │ 🎯 1차 권유: 인터넷·TV 결합 │ │
│ ... │ │ 💵 사은품 즉시지급 강조 │ │
│ │ ├──────────────────┤ │
│ │ │ [견적 계산] [계약 완료] │ │
│ │ └──────────────────┘ │
└──────┴───────────────────────────────────┘
메뉴 #02 계약 처리 모달 (7 섹션)
┌─────────────────────────────────────┐
│ 📝 계약 상세 정보 입력 / 수정 [×] │
├─────────────────────────────────────┤
│ 📦 상품 상세 (read-only · SNAPSHOT) │
│ SK · 결합 · 500M · TV 올 · 페이백 47만│
│ 👤 고객 정보 │
│ 김민수 · 010-1234-5678 · 주소··· │
│ 📅 설치 일정 │
│ 2026-05-05 14:00 · 평일 │
│ 🔗 결합·청구·납부 │
│ 결합: SKT 요즘가족결합 [▾] │
│ 청구서: 이메일 [▾] │
│ 납부: 자동이체 [▾] │
│ ↓ 추가 입력 │
│ 은행 [국민은행▾] 예금주 김민수 │
│ 계좌 ***-***-***-** │
│ 👥 댁내 대기자·판매자 (생략) │
│ 🏦 사은품 입금 (생략) │
│ 🚦 status: in_progress │
├─────────────────────────────────────┤
│ [💾 모든 변경사항 저장] │
└─────────────────────────────────────┘
메뉴 #16 TM 데이터 관리 (어드민)
┌──────────────────────────────────────────────────────────┐
│ ⚡ TM 데이터 관리 [🟢 로컬 / 🟡 데브 / 🔴 라이브] env │
├──────┬───────────────────────────────────────────────────┤
│ 📡인W│ 📡 인터넷·WiFi │
│ 📺TV │ ① 인터넷 단독 요금 (3사) │
│ 📦셋 │ SKT: 22,000 / 33,000 / 38,500 │
│ 🤝결 │ ② WiFi 공유기 (속도별 / 단종·신규) │
│ 🔧설 │ SKT GIGA WiFi · KT GIGA WAVE2 · LGU+ 기가와이파이│
│ 💳카 │ 🎁 LGU+ 500M↑ 기본 제공 옵션 ← 이번 신설 │
│ 💡영 │ · 와이파이 2대 · 와이파이 1대 + 스마트홈 스피커│
│ 🎫티 │ │
│ 📜이력│ 📺 TV 상품 (SKT 9·KT 5·LGU+ 4) │
│ │ 🆕 TV 추가 시 정책 (3사) ← 이번 신설 │
└──────┴───────────────────────────────────────────────────┘
↓
⚠️ 예외·엣지 케이스 처리
| 케이스 | 발생 조건 | 시스템 동작 |
| 같은 phone 다른 customer |
마감원장 import 시 동일 전화번호로 다른 사람 매핑 |
priority 높은 1명만 active · 나머지 call_status='on_hold' |
| 인터넷+TV 같은 통신사 기변 |
고객 현재 KT 인터넷·TV → KT 가입 권유 시도 |
견적 화면에 ⚠️ 경고 + 다른 통신사 권유 분기. 3사 공통 룰 |
| callback 재진입 |
콜 종료 시 call_status=callback · callback_at 미래 시각 |
해당 시각에 콜큐에 다시 등장. 미컨택 7일 → 풀 자동 복귀 |
| rejected (DNT) |
고객이 거절 의사 표시 |
30일 → archived (DNT 영구 보존) · 다시 분배 X · soft delete 후 3년(1095일) 물리 삭제 |
| 계약 취소 |
contract 단계에서 cancellation_reason 입력 |
status=cancelled · contract_cancelled_at 자동 · 정산 집계 제외 |
| 상품 변경 시도 |
계약 진행/완료 단계에서 product_id 변경 |
❌ 차단 — pending 단계만 product 변경 가능. 등록 시점 payback_snapshot 보호 |
| DB 출처 누락 |
status=completed 변경 시 db_source_id 없음 |
❌ 차단 — "콜센터 상담 DB 출처 필수" alert · select에 포커스 |
| 휴대폰 권유 시도 |
콜센터 상담사가 휴대폰 추천 |
운영 룰 위반 (매장 전담 영역) · QC 점검 항목 |
| 미성년·100세 이상 |
마감원장 import 시 birth_date 기준 <19 또는 ≥100 |
자동 필터 — DB 진입 X (외부 노출 차단) |
| 카드 마스킹 cron 실패 |
cron 미실행·예외 발생 |
card_masked_at IS NULL 행은 다음 cron(다음날 03:30)에 재시도 (멱등) |
| 같은 통신사 ID 충돌 |
incentive_products.carrier 'SKT'/'LGU+' (옛) vs 'SK'/'LG' (신) |
현재 신 표기 통일 완료 · normalizeCarrier로 다양한 입력 자동 매핑 |
| iframe 캐시 |
어드민 변경 후 iframe 안 calculator.html 옛 코드 보임 |
SW_VERSION + ?v=N + iframe pool 3중 캐시 우회 (feedback_dev_cache_busting.md) |
↓
📨 주요 API 응답 예시 (JSON)
GET /api/incentive/customer-db?limit=10
{
"customers": [
{
"id": 12345,
"name": "김민수",
"phone": "010-1234-5678",
"birth_date": "1980-05-15",
"tier": 1,
"category": "이동",
"quality_grade": "S",
"priority_score": 125,
"call_status": "assigned",
"assigned_agent_id": "agent-1",
"assigned_at": "2026-05-01T09:35Z",
"carrier": "KT",
"store": "봉이매장"
}
],
"total": 3113
}
POST /api/incentive/sales
{
"id": 9876,
"agent_id": "agent-1",
"customer_db_id": 12345,
"product_id": 42,
"payback_snapshot": 470000,
"point_weight_snapshot": 1.5,
"tier_snapshot": "S",
"is_premium_snapshot": true,
"contract_date": "2026-05-01",
"status": "pending",
"monthly_fee": 49500,
"customer_name": "김민수",
"customer_phone": "010-1234-5678",
"created_at": "2026-05-01T10:35Z"
}
PATCH /api/incentive/sales/9876 (contract)
{
"id": 9876,
"status": "in_progress",
"contract_in_progress_at": "2026-05-01T14:00Z",
"combo_type": "SKT 요즘가족결합",
"billing_method": "이메일",
"payment_method": "자동이체",
"payment_extra": {
"bank": {
"name": "국민은행",
"holder": "김민수",
"account": "***-***-***-**"
}
},
"installation_date": "2026-05-05",
"card_masked_at": null
}
RPC incentive_calc_monthly_settlement
{
"agent_id": "agent-1",
"year_month": "2026-05",
"total_count": 13,
"total_points": 19.5,
"premium_count": 6,
"grade_target": "G2",
"grade_applied": "G2",
"is_penalty": false,
"applied_rate": 30000,
"total_revenue": 6110000,
"total_payback": 4700000,
"total_company_payback_burden": 390000,
"total_agent_payback_deduct": 220000,
"base_salary": 2300000,
"incentive": 390000,
"bonus": 60000,
"agent_total": 2530000,
"company_profit": 1487830,
"profit_rate": 24.34
}
📊 전체 데이터 라이프사이클 (한눈에)
[외부 출처]
마감원장 import · 광고 인입 · DB 구매 · 콜 후 retention
│
▼
┌──────────────────────────────────────────────┐
│ incentive_customer_db (3,113명 active · S/A/B/C 등급)│
│ ↑ calc_customer_grade · calc_age_bonus RPC 자동 │
└──────────────────────────────────────────────┘
│
┌───────┼────────┐
▼ ▼ ▼
지정 분배 균등 분배 분배 요청 승인
└───────┼────────┘
▼
┌──────────────────────────────────────────────┐
│ agent .assigned_agent_id 채움 → 내 콜 리스트 표시 │
└──────────────────────────────────────────────┘
│
▼
TM 큐콜 (#14·#15)
│
┌───────┼────────┐
▼ ▼ ▼
converted callback rejected
│ │ │
│ └─→ callback_at 후 재진입
│ │
│ └─→ 30일 → archived (DNT 영구)
▼
┌──────────────────────────────────────────────┐
│ incentive_sales INSERT (status=pending · snapshot 박제) │
│ + payback_snapshot · point_weight_snapshot · tier_snapshot │
└──────────────────────────────────────────────┘
│
▼
contract 후속 처리
│
┌───────────┼───────────┐
▼ ▼ ▼
completed cancelled (in_progress)
│
├─→ 카드 마스킹 cron (계약완료 +7일 03:30 KST)
│ card_masked_at 자동
│
▼
매월 1일 02:00 KST
cron 또는 admin 수동 (#09 월별 정산)
│
▼
┌──────────────────────────────────────────────┐
│ incentive_settlements UPSERT (status=draft) │
│ RPC incentive_calc_monthly_settlement │
│ = 상담사 포인트 + Grade + 페널티 + 보너스 + 페이백 분담 │
└──────────────────────────────────────────────┘
│
▼
admin: draft → locked → paid
(CSV·인쇄·지급)
📞 봉이 TM CRM — 광주 콜센터 인터넷·TV·렌탈 영업 전담 · 인센티브 V5 자동 정산