📞 봉이 TM CRM 통합 플로우

incentive-admin.html · 4 role · 18 menu · 광주센터 콜DB 영업 전담
🎯 TM CRM SYSTEM
광주 콜센터 TM 영업 → 견적 → 계약 → 정산 통합 시스템
매장 영업과 별개 · 인터넷·TV·렌탈 전담 · 인센티브 V5 자동 정산 · 26+ incentive_* 테이블
열기 →
4
사용자 역할 (role)
18
사이드바 메뉴
26+
incentive_* DB 테이블
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.htmlincentive_salescontract admin
03👥 상담사 관리incentive-agents.htmlincentive_agentsadmin manager
04📦 상품 관리incentive-products.htmlincentive_products (63)admin
05⚙️ 정책 관리incentive-rules.htmlincentive_rules (V5)admin
06🗂️ DB 출처incentive-db-sources.htmlincentive_db_sourcesadmin
07📞 콜 DB 관리incentive-customer-db.htmlincentive_customer_db (3,113)admin manager
08📈 콜 통계incentive-call-stats.htmlincentive_customer_call_logadmin manager
09💰 월별 정산incentive-settlements.htmlincentive_monthly_settlementsadmin
10🎯 월간 목표incentive-goals.htmlincentive_monthly_goalsadmin manager
11👥 상담사 ROI 비교incentive-agents-roi.html집계·ROIadmin
12📋 내 콜 리스트incentive-call-list.html본인 분배agent
13📥 분배 요청incentive-distribution-requests.htmlincentive_distribution_requestsmanager 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.htmlV5 룰 설명전체
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-verify3어드민 → 견적 동기화 (Bundle·Install·Default 폴백)
04-quote-regression5D 객체 default · KT 프리미엄 싱글결합 · 설치비 · TV 상품
05-contract-flow3normalizeCarrier · 카드 마스킹 함수 · 모달 핵심 함수
합계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 자동 정산