sales policy 수립

This commit is contained in:
2025-12-30 22:57:25 +09:00
parent 6677b222b6
commit 526e17d5c8
2 changed files with 564 additions and 547 deletions

534
policy/index.php Normal file
View File

@@ -0,0 +1,534 @@
<?php
/**
* SAM Project - 영업 정책 가이드 (Sales Policy)
* 기반 자료: C:\Users\light\sam\sales\salesmanagement\수당지급체계.md
*/
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SAM Project - 영업 정책 가이드</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;700&family=Outfit:wght@400;600;800&display=swap" rel="stylesheet">
<style>
:root {
--primary: #7b61ff;
--primary-glow: rgba(123, 97, 255, 0.5);
--secondary: #00f2fe;
--bg: #0b0e14;
--card-bg: rgba(255, 255, 255, 0.03);
--card-border: rgba(255, 255, 255, 0.08);
--text-main: #ffffff;
--text-muted: #94a3b8;
--gradient: linear-gradient(135deg, #7b61ff 0%, #00f2fe 100%);
--transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background-color: var(--bg);
color: var(--text-main);
font-family: 'Inter', -apple-system, sans-serif;
line-height: 1.6;
overflow-x: hidden;
}
.stars-container {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
background: radial-gradient(circle at 50% 50%, #1a1f2e 0%, #0b0e14 100%);
}
.container {
max-width: 1100px;
margin: 0 auto;
padding: 0 2rem;
}
/* Hero Section */
.hero {
padding: 8rem 0 4rem;
text-align: center;
position: relative;
}
.badge {
display: inline-block;
padding: 0.5rem 1.2rem;
background: rgba(123, 97, 255, 0.1);
border: 1px solid var(--primary);
border-radius: 99px;
color: var(--primary);
font-weight: 600;
font-size: 0.875rem;
margin-bottom: 1.5rem;
text-transform: uppercase;
letter-spacing: 1px;
}
h1 {
font-family: 'Outfit', sans-serif;
font-size: clamp(2.5rem, 8vw, 4rem);
font-weight: 800;
line-height: 1.1;
margin-bottom: 1.5rem;
}
.gradient-text {
background: var(--gradient);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
.subtitle {
font-size: 1.25rem;
color: var(--text-muted);
max-width: 700px;
margin: 0 auto;
}
/* Glass Card */
.glass-card {
background: var(--card-bg);
backdrop-filter: blur(12px);
border: 1px solid var(--card-border);
border-radius: 24px;
padding: 2.5rem;
margin-bottom: 2rem;
transition: var(--transition);
}
.glass-card:hover {
border-color: rgba(123, 97, 255, 0.3);
background: rgba(255, 255, 255, 0.05);
transform: translateY(-5px);
}
/* Policy Sections */
.section {
padding: 4rem 0;
}
.section-header {
margin-bottom: 3rem;
text-align: left;
}
.section-tag {
color: var(--secondary);
font-weight: 700;
font-size: 0.9rem;
text-transform: uppercase;
letter-spacing: 2px;
display: block;
margin-bottom: 0.5rem;
}
h2 {
font-family: 'Outfit', sans-serif;
font-size: 2.5rem;
font-weight: 700;
margin-bottom: 1rem;
}
/* Grid Layouts */
.policy-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 1.5rem;
}
.policy-item {
display: flex;
flex-direction: column;
gap: 1rem;
}
.policy-icon {
font-size: 2.5rem;
margin-bottom: 0.5rem;
}
.policy-item h3 {
font-size: 1.5rem;
color: var(--secondary);
}
.policy-item p {
color: var(--text-muted);
}
/* Commission Table */
.table-container {
overflow-x: auto;
margin-top: 1rem;
}
table {
width: 100%;
border-collapse: collapse;
text-align: left;
}
th {
padding: 1.5rem 1rem;
color: var(--text-muted);
font-weight: 600;
border-bottom: 1px solid var(--card-border);
}
td {
padding: 1.5rem 1rem;
border-bottom: 1px solid var(--card-border);
}
.highlight-row {
background: rgba(123, 97, 255, 0.05);
}
.ratio {
font-weight: 800;
font-size: 1.25rem;
color: var(--primary);
}
/* Hierarchy Viz */
.hierarchy-viz {
display: flex;
justify-content: space-between;
align-items: center;
padding: 2rem;
background: rgba(0, 0, 0, 0.2);
border-radius: 16px;
margin-top: 2rem;
position: relative;
}
.viz-node {
text-align: center;
z-index: 1;
flex: 1;
}
.viz-circle {
width: 80px;
height: 80px;
border-radius: 50%;
background: var(--gradient);
display: flex;
align-items: center;
justify-content: center;
font-weight: 800;
margin: 0 auto 1rem;
box-shadow: 0 0 20px var(--primary-glow);
}
.viz-label {
font-weight: 600;
font-size: 0.9rem;
}
.viz-line {
position: absolute;
top: 60px;
left: 10%;
right: 10%;
height: 2px;
background: rgba(255, 255, 255, 0.1);
z-index: 0;
}
/* Workflow Grid */
.workflow-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 1.5rem;
}
.wf-card {
position: relative;
padding: 2.5rem 2rem !important;
overflow: hidden;
}
.wf-num {
position: absolute;
top: -10px;
right: 10px;
font-size: 5rem;
font-weight: 900;
color: var(--primary);
opacity: 0.05;
z-index: 0;
pointer-events: none;
}
.wf-card h3 {
position: relative;
z-index: 1;
margin-bottom: 0.75rem;
color: var(--secondary);
}
.wf-card p {
position: relative;
z-index: 1;
font-size: 0.95rem;
}
/* Footer */
.footer {
padding: 6rem 0;
text-align: center;
border-top: 1px solid var(--card-border);
color: var(--text-muted);
font-size: 0.9rem;
}
/* Animations */
@keyframes fadeInUp {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
.animate-up {
animation: fadeInUp 0.8s ease forwards;
}
/* Custom Colors for roles */
.role-seller { color: #4ade80; }
.role-manager { color: #a78bfa; }
.role-educator { color: #fb923c; }
</style>
</head>
<body>
<div class="stars-container"></div>
<header class="hero">
<div class="container">
<div class="badge animate-up">Sales Policy Guide</div>
<h1 class="animate-up">SAM Project<br><span class="gradient-text">영업 수당 지급 정책</span></h1>
<p class="subtitle animate-up">투명하고 합리적인 3단계 보상 체계를 통해 파트너의 성장을 지원합니다.</p>
</div>
</header>
<main class="container">
<!-- Section 1: Core Principles -->
<section class="section">
<div class="section-header">
<span class="section-tag">01. Core Principles</span>
<h2>기본 원칙 및 대상</h2>
</div>
<div class="glass-card animate-up">
<div class="policy-grid">
<div class="policy-item">
<div class="policy-icon">🎯</div>
<h3>가입비 중심 보상</h3>
<p>수당은 1회성 <strong>가입비</strong>에 대해서만 지급됩니다. 이는 고품질의 초기 인프라 구축 및 파트너의 적극적인 유치를 지원하기 위함입니다.</p>
</div>
<div class="policy-item">
<div class="policy-icon">📊</div>
<h3>협업 중심 구조</h3>
<p>판매자와 관리자뿐만 아니라 기술 지원을 담당하는 메뉴제작 협업자에게도 적절한 보상을 제공하여 유기적인 서비스 제공이 가능하도록 돕습니다.</p>
</div>
</div>
</div>
</section>
<!-- Section 2: Commission Ratios -->
<section class="section">
<div class="section-header">
<span class="section-tag">02. Commission Ratios</span>
<h2>수당 지급 비율</h2>
</div>
<div class="glass-card animate-up">
<div class="table-container">
<table>
<thead>
<tr>
<th>구분</th>
<th>지급 비율</th>
<th>대상 및 정의</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="role-seller">●</span> <strong>판매자 (Seller)</strong></td>
<td><span class="ratio">20%</span></td>
<td>직접 영업 및 계약 성사 담당자</td>
</tr>
<tr>
<td><span class="role-manager">●</span> <strong>관리자 (Manager)</strong></td>
<td><span class="ratio">5%</span></td>
<td>하위 영업 파트너 관리 및 지원</td>
</tr>
<tr>
<td><span class="role-educator">●</span> <strong>메뉴제작 협업수당</strong></td>
<td><span class="ratio">별도</span></td>
<td>운영팀에서 난이도별 별도 산정 (실비 보조)</td>
</tr>
</tbody>
<tfoot>
<tr class="highlight-row">
<td colspan="2"><strong>수당 정산 기준</strong></td>
<td><strong>가입비 입금 확인 후 익월 지급</strong></td>
</tr>
</tfoot>
</table>
</div>
</div>
</section>
<!-- Section 3: Hierarchy Visualization -->
<section class="section">
<div class="section-header">
<span class="section-tag">03. Hierarchy Details</span>
<h2>계층 구조 및 수당 시뮬레이션</h2>
</div>
<div class="glass-card animate-up">
<p>영업 관리자의 수익은 자신의 활동뿐만 아니라 조직의 활성화에 따라 극대화됩니다.</p>
<div class="hierarchy-viz">
<div class="viz-line"></div>
<div class="viz-node">
<div class="viz-circle">20%</div>
<div class="viz-label">판매자 (영업권)</div>
</div>
<div class="viz-node">
<div class="viz-circle" style="background: #a78bfa;">5%</div>
<div class="viz-label">관리자 (관리권)</div>
</div>
<div class="viz-node">
<div class="viz-circle" style="background: #fb923c;">+α</div>
<div class="viz-label">메뉴제작 (기술지원)</div>
</div>
</div>
<div style="margin-top: 3rem;">
<h3 style="margin-bottom: 1rem;">계산 예시 (총 가입비 1억원 기준)</h3>
<div class="policy-grid">
<div class="glass-card" style="padding: 1.5rem; background: rgba(255,255,255,0.02);">
<h4 class="role-seller">판매자 수당 (2,000만원)</h4>
<p>₩20,000,000 × 20% = <strong>₩4,000,000</strong></p>
</div>
<div class="glass-card" style="padding: 1.5rem; background: rgba(255,255,255,0.02);">
<h4 class="role-manager">관리자 수당 (2,000만원)</h4>
<p>₩20,000,000 × 5% = <strong>₩1,000,000</strong></p>
</div>
<div class="glass-card" style="padding: 1.5rem; background: rgba(255,255,255,0.02);">
<h4 class="role-educator">메뉴제작 협업수당</h4>
<p><strong>운영팀 별도 산정 및 지급</strong></p>
</div>
</div>
<div class="glass-card" style="margin-top: 1rem; border: 1px solid var(--secondary); background: rgba(0, 242, 254, 0.05);">
<p style="font-size: 1.25rem; text-align: center;"><strong>총 가입비 수당: 25% + 메뉴제작비</strong></p>
</div>
</div>
</div>
</section>
<!-- Section 4: Sales Success Workflow -->
<section class="section">
<div class="section-header">
<span class="section-tag">04. Sales Success Workflow</span>
<h2>6단계 성공 프로세스</h2>
<p>단순한 판매를 넘어, 고객의 성공을 설계하는 표준 영업 프로세스입니다.</p>
</div>
<div class="workflow-grid">
<div class="glass-card wf-card">
<div class="wf-num">01</div>
<h3>사전 준비 (Prep)</h3>
<p>고객사 심층 분석 및 경쟁사 동향 파악. '비용 절감'과 '관리 효율' 중 핵심 공략 포인트 설정.</p>
</div>
<div class="glass-card wf-card">
<div class="wf-num">02</div>
<h3>접근 및 탐색 (Approach)</h3>
<p>Key-man 식별 및 컨택. 단순 소개가 아닌 '인사이트 공유'를 목적으로 미팅 기회 확보.</p>
</div>
<div class="glass-card wf-card">
<div class="wf-num">03</div>
<h3>제안 및 솔루션</h3>
<p>AI 교차 검증 전략(Antigravity/Claude Code)을 통한 압도적인 품질 및 비용 효율 제안.</p>
</div>
<div class="glass-card wf-card">
<div class="wf-num">04</div>
<h3>계약 체결 (Closing)</h3>
<p>가입비 확정 및 서비스 범위(SOW) 명시. 수당 산정의 기준이 되는 가입비 완료 유도.</p>
</div>
<div class="glass-card wf-card">
<div class="wf-num">05</div>
<h3>영업 이관 (Handover)</h3>
<p>영업팀에서 매니저 시나리오로의 완벽한 정보 전달. 리스크 요인 및 고객 특이사항 공유.</p>
</div>
<div class="glass-card wf-card">
<div class="wf-num">06</div>
<h3>테스트 및 안정화</h3>
<p>TestSprite MCP를 통한 자동화 검증으로 '버그 없는 배포'를 실현하여 고객 신뢰 확보.</p>
</div>
</div>
</section>
<!-- Section 5: Schedule & Margin -->
<section class="section">
<div class="section-header">
<span class="section-tag">05. Schedule & Margin</span>
<h2>지급 일정 및 운영 정책</h2>
</div>
<div class="policy-grid">
<div class="glass-card animate-up">
<div class="policy-icon">📅</div>
<h3>수당 지급 시점</h3>
<p>고객사의 가입비 입금이 완료된 날을 기준으로 수당이 확정되며, 익월 정해진 지급일에 일괄 지급됩니다.</p>
</div>
<div class="glass-card animate-up">
<div class="policy-icon">🏦</div>
<h3>회사 운영 마진</h3>
<p>회사는 가입비의 약 <strong>70% ~ 75%</strong> 내외를 플랫폼 운영, 서버 유지보수, 마케팅 지원 등을 위한 인프라 비용으로 확보하여 지속 가능한 경영 토대를 구축합니다.</p>
</div>
</div>
</section>
<!-- Section 6: FAQs -->
<section class="section">
<div class="section-header">
<span class="section-tag">Appendix</span>
<h2>주요 Q&A</h2>
</div>
<div class="glass-card animate-up">
<div style="margin-bottom: 1.5rem;">
<h4 style="color: var(--secondary);">Q. 하위 파트너가 없는 경우는 어떻게 되나요?</h4>
<p>본인의 직접 판매에 대한 20% 수당만 지급됩니다. 관리자 및 교육자 수당은 하위 계층이 형성되었을 때만 발생합니다.</p>
</div>
<div style="margin-bottom: 1.5rem;">
<h4 style="color: var(--secondary);">Q. 계약이 취소되면 수당을 반환해야 하나요?</h4>
<p>이미 지급된 가입비 수당은 회수하지 않는 것을 원칙으로 하나, 부정 계약 등의 특수 상황 발생 시 별도 심의가 있을 수 있습니다.</p>
</div>
<div>
<h4 style="color: var(--secondary);">Q. 월 구독료에 대한 수당은 없나요?</h4>
<p>현재 SAM 수당 정책은 신규 파트너십 구축 및 인프라 기여도에 대한 가치를 높게 평가하여 <strong>가입비</strong>에만 수당을 집중하고 있습니다. 구독료는 서비스의 안정적 유지 및 고도화 비용으로 활용됩니다.</p>
</div>
</div>
</section>
</main>
<footer class="footer">
<div class="container">
<p>&copy; 2025 SAM Project Admin. All Rights Reserved.</p>
<p style="margin-top: 0.5rem; opacity: 0.6;">본 문서는 SAM 프로젝트의 공식 영업 정책을 담고 있으며, 정책 변경 시 업데이트될 수 있습니다.</p>
</div>
</footer>
</body>
</html>

View File

@@ -9,22 +9,13 @@
## 1. 기본 원칙
### 1.1 수당 지급 대상
- **가입비만 수당 지급 대상**
- 구독료는 수당 계산에서 제외
- **가입비(Join Fee)에 대해서만 수당 지급**
- 구독료는 수당 계산에서 제외 (0%)
### 1.2 계층
```
내 조직 (영업관리자)
├── 내 직접 판매 (20%)
├── 1차 하위 (직속) (5%)
│ └── 2차 하위 (손자) (3%)
└── 1차 하위 (직속) (5%)
```
### 1.3 핵심 개념
- **직접 판매**: 내가 직접 판매한 계약
- **1차 하위 (관리자 수당)**: 내가 초대한 영업관리가 판매한 계약
- **2차 하위 (교육자 수당)**: 내 하위의 하위가 판매한 계약
### 1.2 수당
1. **판매자 수당 (20%)**: 직접 계약을 성사시킨 담당자
2. **관리자 수당 (5%)**: 해당 판매자를 관리하는 직속 상위 관리자
3. **메뉴제작 협업수당 (운영팀 산정)**: 메뉴 세팅 및 제작에 참여한 협업자에게 지급되는 실비 성격의 수당
---
@@ -32,553 +23,45 @@
| 구분 | 지급 비율 | 설명 |
|------|-----------|------|
| **직접 판매** | 가입비의 **20%** | 본인이 직접 판매한 계약의 가입비 |
| **관리자 수당** | 가입비의 **5%** | 직속 하위(1차)가 판매한 계약의 가입비 |
| **교육자 수당** | 가입비의 **3%** | 2차 하위(손자)가 판매한 계약의 가입비 |
**총 수당 = 직접 판매(20%) + 관리자 수당(5%) + 교육자 수당(3%)**
| **판매** | 가입비의 **20%** | 직접 영업 성사 담당자 |
| **관리자** | 가입비의 **5%** | 하위 파트너 관리 담당자 |
| **메뉴제작 협업자** | **운영팀 별도 산정** | 메뉴 제작 및 세팅 지원 담당자 |
---
## 3. 계층 구조 상세 설명
## 3. 계층 구조 및 역할
### 3.1 역할 정의
### 3.1 역할 상세
#### 판매자 (Seller)
- 직접 영업을 성사시킨 담당
- 자신의 판매에 대해 **20%** 수당
- 고객사와 직접 소통하여 계약을 체결한 영업
- 가입비의 **20%** 수당으로 수령
#### 관리자 (Manager)
- 판매자를 데려온 상위 담당자
- 하위 1단계의 판매에 대해 **5%** 수당
- 판매자의 활동을 지원하고 성과를 관리하는 상위 파트너
- 판매자 실적의 **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만원**
#### 메뉴제작 협업자 (Collaborator)
- 프로젝트의 기술적인 메뉴 세팅, 자료 입력 등을 지원
- 건별 난이도 및 작업량에 따라 운영팀에서 별도로 수당 금액 산정
---
## 4. 수당 계산 로직
## 4. 수당 지급 프로세스
### 4.1 내 총 수당 계산 공식
```
내 총 수당 = (내 직접 판매 × 20%)
+ (1차 하위 전체 판매 × 5%)
+ (2차 하위 전체 판매 × 3%)
```
### 4.2 JavaScript 계산 코드
```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;
```
1. **계약 체결**: 고객사와 서비스 이용 계약 완료
2. **가입비 납부**: 고객사가 가입비 전액을 본사에 납부
3. **수당 확정**: 가입비 납부 확인 후, 수당 정산 데이터 확정
4. **지급**: 정해진 정산 주기에 따라 해당 담당자들에게 지급
---
## 5. 지급 일정
## 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 조직 노드 구조
```javascript
{
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 직접 판매 노드
```javascript
{
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 계약 데이터 구조
```javascript
{
id: 'contract-123',
contractDate: '2024-12-01', // YYYY-MM-DD 형식
amount: 25000000 // 가입비
}
```
---
## 11. 기간별 필터링 로직
### 11.1 필터링 알고리즘
```javascript
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 역할별 계약 데이터 구조
```javascript
{
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 계약 생성 로직
```javascript
// 각 영업담당마다 역할별 계약 생성
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 역할별 계약 데이터 구조
```javascript
{
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 계약 생성 로직
```javascript
// 각 영업담당마다 역할별 계약 생성
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** |
---
## 문의 및 개선 제안
개발 과정에서 수당 체계 관련 질문이나 개선 제안 사항이 있으면 이 문서를 업데이트하여 관리합니다.
### 5.1 마진 계산
- 회사 마진 = 가입비 - (판매자 수당 + 관리자 수당 + 메뉴제작 협업수당)
- 기본적으로 가입비의 약 **75%** 내외가 회사 운영 및 개발 비용으로 활용됨
### 5.2 특이 사항
- 구독료는 플랫폼 유지보수 및 클라우드 인프라 비용으로 활용되며 수당 지급 대상이 아님
- 계약 취소 시 지급된 수당의 처리 방식은 별도 운영 규정을 따름