18 KiB
18 KiB
영업관리 수당 지급 체계
개요
이 문서는 영업관리 시스템의 수당 지급 체계를 정의합니다. 수당은 가입비에 대해서만 지급되며, 구독료에 대한 수당은 지급되지 않습니다.
1. 기본 원칙
1.1 수당 지급 대상
- 가입비만 수당 지급 대상
- 구독료는 수당 계산에서 제외
1.2 계층 구조
내 조직 (영업관리자)
├── 내 직접 판매 (20%)
├── 1차 하위 (직속) (5%)
│ └── 2차 하위 (손자) (3%)
└── 1차 하위 (직속) (5%)
1.3 핵심 개념
- 직접 판매: 내가 직접 판매한 계약
- 1차 하위 (관리자 수당): 내가 초대한 영업관리가 판매한 계약
- 2차 하위 (교육자 수당): 내 하위의 하위가 판매한 계약
2. 수당 지급 비율
| 구분 | 지급 비율 | 설명 |
|---|---|---|
| 직접 판매 | 가입비의 20% | 본인이 직접 판매한 계약의 가입비 |
| 관리자 수당 | 가입비의 5% | 직속 하위(1차)가 판매한 계약의 가입비 |
| 교육자 수당 | 가입비의 3% | 2차 하위(손자)가 판매한 계약의 가입비 |
총 수당 = 직접 판매(20%) + 관리자 수당(5%) + 교육자 수당(3%)
3. 계층 구조 상세 설명
3.1 역할 정의
판매자 (Seller)
- 직접 영업을 성사시킨 담당자
- 자신의 판매에 대해 20% 수당
관리자 (Manager)
- 판매자를 데려온 상위 담당자
- 하위 1단계의 판매에 대해 5% 수당
교육자 (Educator)
- 관리자를 데려온 상위 담당자
- 하위 2단계의 판매에 대해 3% 수당
3.2 계층 예시
A (영업관리자)
├── A의 직접 판매: 1,000만원
├── B (1차 하위)
│ └── B의 판매: 2,000만원
└── C (1차 하위)
├── C의 판매: 1,500만원
└── D (2차 하위)
└── D의 판매: 3,000만원
A가 받는 수당:
- A의 직접 판매: 1,000만원 × 20% = 200만원
- B의 판매 (관리자 수당): 2,000만원 × 5% = 100만원
- C의 판매 (관리자 수당): 1,500만원 × 5% = 75만원
- D의 판매 (교육자 수당): 3,000만원 × 3% = 90만원
- A의 총 수당: 465만원
4. 수당 계산 로직
4.1 내 총 수당 계산 공식
내 총 수당 = (내 직접 판매 × 20%)
+ (1차 하위 전체 판매 × 5%)
+ (2차 하위 전체 판매 × 3%)
4.2 JavaScript 계산 코드
// 내 직접 판매 수당 (20%)
const myDirectSales = findDirectSales(myOrg);
const sellerCommission = myDirectSales * 0.20;
// 1차 하위 관리자 수당 (5%)
const level1Sales = calculateLevel1TotalSales(myOrg);
const managerCommission = level1Sales * 0.05;
// 2차 하위 교육자 수당 (3%)
const level2Sales = calculateLevel2TotalSales(myOrg);
const educatorCommission = level2Sales * 0.03;
// 총 수당
const totalCommission = sellerCommission + managerCommission + educatorCommission;
5. 지급 일정
5.1 계약일 정의
- 계약일: 가입비 완료일을 기준으로 함
5.2 수당 지급일
- 가입비 수당: 가입비 완료 후 지급
- 구독료 수당은 없음 (구독료는 수당 대상 아님)
6. 회사 마진
6.1 마진 계산
회사 마진 = 가입비 - 총 수당
= 가입비 - (20% + 5% + 3%)
= 가입비 × 72%
6.2 최대 수당 비율
- 3단계 전체가 채워진 경우 최대 28% 수당
- 나머지 **72%**는 회사 마진
7. 특수 상황 처리
7.1 하위가 없는 경우
- 1차 하위가 없으면: 관리자 수당(5%) 없음
- 2차 하위가 없으면: 교육자 수당(3%) 없음
- 본인의 직접 판매(20%)만 받음
7.2 계약 취소/해지
- 이미 지급된 가입비 수당은 회수하지 않음
- 향후 정책 보완 예정
8. 대시보드 표시 구조
8.1 전체 누적 실적
- 총 가입비: 전체 기간 누적 가입비
- 총 수당: 전체 기간 누적 수당
- 전체 건수: 전체 계약 건수
8.2 기간별 실적 (당월 기본)
- 판매자 수당 (20%): 기간 내 직접 판매 수당
- 관리자 수당 (5%): 기간 내 1차 하위 관리 수당
- 교육자 수당 (3%): 기간 내 2차 하위 교육 수당
- 총 수당: 세 가지 수당의 합계
8.3 기간 선택 옵션
- 당월: 현재 년월 (기본값)
- 기간 설정: 시작 년월 ~ 종료 년월
8.4 기간별 필터링
- 각 계약의
contractDate기준으로 필터링 - 선택된 기간 내 계약만 집계
- 조직 트리도 동일 기간으로 필터링
9. 조직 구조 표시
9.1 계층별 색상
- Depth 0 (내 조직): 파란색
- Depth 1 (1차 하위): 초록색
- Depth 2 (2차 하위): 보라색
- 직접 판매: 노란색
9.2 표시 정보
각 노드마다 표시:
- 이름 및 역할
- 총 매출 (가입비)
- 계약 건수
- 내 수당: 해당 노드의 판매로부터 내가 받는 수당
9.3 직접 판매 항목
- 오직 **"내 조직"**만 직접 판매 항목을 가짐
- 1차, 2차 영업관리는 자신의 판매가 자동으로 집계됨
- 노란색 배경, 쇼핑카트 아이콘으로 구분
10. 데이터 구조
10.1 조직 노드 구조
{
id: 'unique-id',
name: '김철수',
depth: 1, // 0: 내 조직, 1: 1차 하위, 2: 2차 하위
role: '영업관리',
isDirect: false, // 직접 판매 항목 여부
totalSales: 50000000, // 총 매출 (가입비)
contractCount: 15,
commission: 2500000, // 내가 받는 수당
contracts: [ // 계약 목록 (날짜 포함)
{ id: 'c1', contractDate: '2024-11-15', amount: 25000000 },
{ id: 'c2', contractDate: '2024-12-01', amount: 25000000 }
],
children: [ /* 하위 노드 */ ]
}
10.2 직접 판매 노드
{
id: 'root-direct',
name: '내 직접 판매',
depth: 0,
role: '직접 판매',
isDirect: true,
totalSales: 30000000,
contractCount: 3,
commission: 6000000, // 3천만원 × 20%
contracts: [
{ id: 'c1', contractDate: '2024-12-01', amount: 10000000 },
{ id: 'c2', contractDate: '2024-12-15', amount: 20000000 }
],
children: []
}
10.3 계약 데이터 구조
{
id: 'contract-123',
contractDate: '2024-12-01', // YYYY-MM-DD 형식
amount: 25000000 // 가입비
}
11. 기간별 필터링 로직
11.1 필터링 알고리즘
filterNodeByDate(node, startDate, endDate) {
// 1. 해당 노드의 계약 중 기간 내 계약만 필터링
const filteredContracts = node.contracts.filter(contract => {
const contractDate = new Date(contract.contractDate);
return contractDate >= startDate && contractDate <= endDate;
});
// 2. 하위 노드도 재귀적으로 필터링
const filteredChildren = node.children
.map(child => filterNodeByDate(child, startDate, endDate))
.filter(c => c !== null);
// 3. 매출 재계산
const ownSales = filteredContracts.reduce((sum, c) => sum + c.amount, 0);
const childrenSales = filteredChildren.reduce((sum, c) => sum + c.totalSales, 0);
const totalSales = ownSales + childrenSales;
// 4. 데이터가 없으면 null 반환 (표시 안함)
if (totalSales === 0 && filteredChildren.length === 0) {
return null;
}
// 5. 수당 재계산
const commission = calculateCommission(node, ownSales, childrenSales);
return { ...node, totalSales, contractCount, commission, contracts: filteredContracts, children: filteredChildren };
}
11.2 기간 옵션
- 당월:
new Date(year, month, 1)~new Date(year, month+1, 0) - 커스텀: 사용자가 선택한 시작일 ~ 종료일
12. 운영자 화면 - 영업담당 관리
12.1 개요
운영자는 모든 영업담당의 실적과 수당을 역할별로 구분하여 확인할 수 있습니다.
12.2 통계 카드 (6개)
| 카드 | 설명 | 계산 방식 |
|---|---|---|
| 총 건수 | 전체 계약 건수 | 모든 영업담당의 계약 건수 합계 |
| 이번달 건수 | 이번달 신규 계약 | 당월 계약 건수 합계 |
| 총 가입비 | 전체 누적 가입비 | 모든 계약의 가입비 합계 |
| 총 수당 지급 | 전체 누적 수당 | 모든 영업담당에게 지급한 수당 합계 |
| 이번달 수당 | 이번달 지급 예정 | 당월 계약에 대한 수당 합계 |
| 지난달 수당 | 지난달 지급 완료 | 전월 계약에 대한 수당 합계 |
12.3 영업담당 개별 카드 구조
각 영업담당 카드에 표시:
김철수 [아이콘]
├── 총 건수: 15건
├── 이번달 건수: 3건
├── 총 가입비: ₩75,000,000
├── └ 직접 판매 (20%): ₩6,000,000
├── └ 관리자 (5%): ₩2,000,000
├── └ 교육자 (3%): ₩900,000
├── 총 수당: ₩8,900,000
├── 이번달 수당: ₩1,200,000
└── 지난달 수당: ₩1,500,000
12.4 역할별 계약 데이터 구조
{
id: 'contract-123',
customer: '고객사 A',
contractDate: '2024-12-01',
amount: 25000000,
role: 'direct' // 'direct', 'manager', 'educator'
}
역할 타입:
direct: 직접 판매 (20% 수당)manager: 1차 하위 관리 (5% 수당)educator: 2차 하위 교육 (3% 수당)
12.5 세부 내역 화면
영업담당 클릭 시 표시:
역할별 수당 요약 (3개 카드)
| 직접 판매 (20%) | 관리자 수당 (5%) | 교육자 수당 (3%) |
|---|---|---|
| 🟢 ₩6,042,670 | 🟣 ₩2,362,340 | 🟠 ₩914,256 |
| ₩30,213,350 × 20% | ₩47,246,800 × 5% | ₩30,475,200 × 3% |
계약 목록 테이블
| 번호 | 고객사 | 계약일 | 역할 | 가입비 | 수당 |
|---|---|---|---|---|---|
| 1 | 고객사 A | 2024-11-15 | 🟢 직접 판매 (20%) | ₩25,000,000 | ₩5,000,000 |
| 2 | 고객사 B | 2024-12-01 | 🟣 관리자 (5%) | ₩30,000,000 | ₩1,500,000 |
| 3 | 고객사 C | 2024-10-20 | 🟠 교육자 (3%) | ₩20,000,000 | ₩600,000 |
| ... | ... | ... | ... | ... | ... |
| 합계 | ₩107,689,150 | ₩9,477,266 |
12.6 역할별 색상 구분
- 🟢 초록색: 직접 판매 (20%)
- 🟣 보라색: 관리자 (5%)
- 🟠 주황색: 교육자 (3%)
12.7 계약 생성 로직
// 각 영업담당마다 역할별 계약 생성
const directContracts = generateContracts(2~6건); // 직접 판매
const managerContracts = generateContracts(3~10건); // 1차 하위
const educatorContracts = generateContracts(1~5건); // 2차 하위
// 역할 구분
directContracts.forEach(c => c.role = 'direct');
managerContracts.forEach(c => c.role = 'manager');
educatorContracts.forEach(c => c.role = 'educator');
// 수당 계산
const directCommission = directSales × 0.20;
const managerCommission = managerSales × 0.05;
const educatorCommission = educatorSales × 0.03;
const totalCommission = directCommission + managerCommission + educatorCommission;
12. 운영자 화면 - 영업담당 관리
12.1 개요
운영자는 모든 영업담당의 실적과 수당을 역할별로 구분하여 확인할 수 있습니다.
12.2 통계 카드 (6개)
| 카드 | 설명 | 계산 방식 |
|---|---|---|
| 총 건수 | 전체 계약 건수 | 모든 영업담당의 계약 건수 합계 |
| 이번달 건수 | 이번달 신규 계약 | 당월 계약 건수 합계 |
| 총 가입비 | 전체 누적 가입비 | 모든 계약의 가입비 합계 |
| 총 수당 지급 | 전체 누적 수당 | 모든 영업담당에게 지급한 수당 합계 |
| 이번달 수당 | 이번달 지급 예정 | 당월 계약에 대한 수당 합계 |
| 지난달 수당 | 지난달 지급 완료 | 전월 계약에 대한 수당 합계 |
12.3 영업담당 개별 카드 구조
각 영업담당 카드에 표시:
김철수 [아이콘]
├── 총 건수: 15건
├── 이번달 건수: 3건
├── 총 가입비: ₩75,000,000
├── └ 직접 판매 (20%): ₩6,000,000
├── └ 관리자 (5%): ₩2,000,000
├── └ 교육자 (3%): ₩900,000
├── 총 수당: ₩8,900,000
├── 이번달 수당: ₩1,200,000
└── 지난달 수당: ₩1,500,000
12.4 역할별 계약 데이터 구조
{
id: 'contract-123',
customer: '고객사 A',
contractDate: '2024-12-01',
amount: 25000000,
role: 'direct' // 'direct', 'manager', 'educator'
}
역할 타입:
direct: 직접 판매 (20% 수당)manager: 1차 하위 관리 (5% 수당)educator: 2차 하위 교육 (3% 수당)
12.5 세부 내역 화면
영업담당 클릭 시 표시:
역할별 수당 요약 (3개 카드)
| 직접 판매 (20%) | 관리자 수당 (5%) | 교육자 수당 (3%) |
|---|---|---|
| 🟢 ₩6,042,670 | 🟣 ₩2,362,340 | 🟠 ₩914,256 |
| ₩30,213,350 × 20% | ₩47,246,800 × 5% | ₩30,475,200 × 3% |
계약 목록 테이블
| 번호 | 고객사 | 계약일 | 역할 | 가입비 | 수당 |
|---|---|---|---|---|---|
| 1 | 고객사 A | 2024-11-15 | 🟢 직접 판매 (20%) | ₩25,000,000 | ₩5,000,000 |
| 2 | 고객사 B | 2024-12-01 | 🟣 관리자 (5%) | ₩30,000,000 | ₩1,500,000 |
| 3 | 고객사 C | 2024-10-20 | 🟠 교육자 (3%) | ₩20,000,000 | ₩600,000 |
| ... | ... | ... | ... | ... | ... |
| 합계 | ₩107,689,150 | ₩9,477,266 |
12.6 역할별 색상 구분
- 🟢 초록색: 직접 판매 (20%)
- 🟣 보라색: 관리자 (5%)
- 🟠 주황색: 교육자 (3%)
12.7 계약 생성 로직
// 각 영업담당마다 역할별 계약 생성
const directContracts = generateContracts(2~6건); // 직접 판매
const managerContracts = generateContracts(3~10건); // 1차 하위
const educatorContracts = generateContracts(1~5건); // 2차 하위
// 역할 구분
directContracts.forEach(c => c.role = 'direct');
managerContracts.forEach(c => c.role = 'manager');
educatorContracts.forEach(c => c.role = 'educator');
// 수당 계산
const directCommission = directSales × 0.20;
const managerCommission = managerSales × 0.05;
const educatorCommission = educatorSales × 0.03;
const totalCommission = directCommission + managerCommission + educatorCommission;
13. API 연동 (향후 구현)
13.1 필요한 API 엔드포인트
GET /api/sales/organization?startDate=2024-12-01&endDate=2024-12-31
GET /api/operator/managers?startDate=2024-12-01&endDate=2024-12-31
13.2 응답 데이터 구조
위의 "10. 데이터 구조"와 동일한 형식으로 반환
14. 개발 노트
14.1 구현 완료
- ✅ 가입비 기반 수당 계산
- ✅ 3단계 계층 구조 (직접/1차/2차)
- ✅ 계약 날짜 기반 기간 필터링
- ✅ 대시보드 통계 연동
- ✅ 역할별 수당 상세 표시
- ✅ 계약 날짜 데이터 구조 추가
- ✅ 운영자 화면 영업담당 관리
- ✅ 역할별 계약 구분 (직접/관리자/교육자)
- ✅ 영업담당 세부 내역 역할별 표시
- ✅ 모달창 계약 상세 내역 및 날짜 표시
14.2 향후 개선 사항
- 실제 DB 연동
- 계약 취소/해지 처리 로직
- 수당 지급 이력 관리
- 월별 수당 지급 스케줄
- 세금 공제 계산
- 운영자 화면 실시간 데이터 연동
- 영업담당별 성과 분석 리포트
14.3 주의사항
- 현재는 샘플 랜덤 데이터 사용 (최근 12개월 내 랜덤 날짜)
- 실제 구현 시 DB의 계약 데이터 기반으로 변경 필요
- PHP 7.3 호환성 유지
- 운영자 화면은 각 영업담당의 역할별 계약을 모두 표시
- 각 영업담당은 직접 판매, 관리자, 교육자 역할을 동시에 수행 가능
15. 변경 이력
| 날짜 | 버전 | 변경 내용 |
|---|---|---|
| 2024-12-02 | 1.0 | 초기 문서 작성 - 가입비 기반 수당 체계 정의 |
| 2024-12-02 | 1.1 | 계약 날짜 구조 추가 - 기간별 필터링 로직 문서화 |
| 2024-12-02 | 1.2 | 운영자 화면 추가 - 역할별 계약 구분 및 수당 관리 상세화 |
16. 운영자 화면 계산 예시
16.1 영업담당 "김철수"의 데이터
역할별 계약:
- 직접 판매: 3건, 총 ₩30,000,000
- 관리자 역할: 8건, 총 ₩100,000,000 (1차 하위의 판매)
- 교육자 역할: 5건, 총 ₩50,000,000 (2차 하위의 판매)
수당 계산:
직접 판매 수당 = ₩30,000,000 × 20% = ₩6,000,000
관리자 수당 = ₩100,000,000 × 5% = ₩5,000,000
교육자 수당 = ₩50,000,000 × 3% = ₩1,500,000
───────────────────────────────────────────────
총 수당 = ₩12,500,000
카드 표시:
김철수
├── 총 건수: 16건
├── 이번달 건수: 3건
├── 총 가입비: ₩180,000,000
├── └ 직접 판매 (20%): ₩6,000,000
├── └ 관리자 (5%): ₩5,000,000
├── └ 교육자 (3%): ₩1,500,000
└── 총 수당: ₩12,500,000
16.2 세부 내역 테이블 예시
| 번호 | 고객사 | 계약일 | 역할 | 가입비 | 수당 |
|---|---|---|---|---|---|
| 1 | 고객사 A | 2024-11-15 | 직접 판매 (20%) | ₩10,000,000 | ₩2,000,000 |
| 2 | 고객사 B | 2024-12-01 | 직접 판매 (20%) | ₩20,000,000 | ₩4,000,000 |
| 3 | 고객사 C | 2024-10-20 | 관리자 (5%) | ₩25,000,000 | ₩1,250,000 |
| 4 | 고객사 D | 2024-11-03 | 관리자 (5%) | ₩35,000,000 | ₩1,750,000 |
| 5 | 고객사 E | 2024-09-15 | 교육자 (3%) | ₩20,000,000 | ₩600,000 |
| 6 | 고객사 F | 2024-12-10 | 교육자 (3%) | ₩30,000,000 | ₩900,000 |
| 합계 | ₩180,000,000 | ₩12,500,000 |
문의 및 개선 제안
개발 과정에서 수당 체계 관련 질문이나 개선 제안 사항이 있으면 이 문서를 업데이트하여 관리합니다.