refactor: [price-simulator] 수당 구조 및 무료 체험 정책 변경

- 개인 가입: 매니저 5% → 유치 파트너 5%, 매니저 수당은 첫 달 구독료로 변경
- 단체 가입: 유치 파트너 3%는 비공식이므로 화면에서 제외
- 유치 파트너 있음(협업지원금3%) 체크박스 및 관련 로직 전체 제거
- 무료 체험(1주일) 기능 전체 제거
This commit is contained in:
김보곤
2026-03-16 15:48:04 +09:00
parent a352fa105b
commit 2c1587cae1

View File

@@ -225,15 +225,18 @@ class="inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-70
<span class="font-bold text-blue-600">20%</span>
</div>
<div class="flex justify-between p-2 bg-gray-50 rounded">
<span class="text-gray-600">매니저 수당</span>
<span class="text-gray-600">유치 파트너 수당</span>
<span class="font-bold text-purple-600">5%</span>
</div>
<div class="flex justify-between p-2 bg-gray-50 rounded">
<span class="text-gray-600">매니저 수당</span>
<span class="font-bold text-teal-600"> 구독료</span>
</div>
<div class="flex justify-between p-2 bg-gray-50 rounded">
<span class="text-gray-600"> 수당률</span>
<span class="font-bold text-gray-900">25%</span>
<span class="font-bold text-gray-900">25% + 구독료</span>
</div>
</div>
<p class="text-xs text-gray-500">유치 파트너가 있으면 +3% (협업지원금)</p>
</div>
</div>
@@ -252,29 +255,23 @@ class="inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-70
<span class="text-gray-600">단체 수당</span>
<span class="font-bold text-green-600">30%</span>
</div>
<div class="flex justify-between p-2 bg-gray-50 rounded">
<span class="text-gray-600">매니저 수당</span>
<span class="font-bold text-gray-400">0%</span>
</div>
<div class="flex justify-between p-2 bg-gray-50 rounded">
<span class="text-gray-600"> 수당률</span>
<span class="font-bold text-gray-900">30%</span>
</div>
</div>
<p class="text-xs text-gray-500">유치 파트너가 있으면 +3% (협업지원금)</p>
</div>
</div>
</div>
<div class="bg-white rounded-xl p-5 border border-gray-100">
<h3 class="font-bold text-gray-900 mb-3">유치 파트너 (협업지원금)?</h3>
<h3 class="font-bold text-gray-900 mb-3">매니저 수당이?</h3>
<p class="text-sm text-gray-700 leading-relaxed">
나를 영업파트너 소개(유치) 사람 있다면 <strong>"유치 파트너 있음"</strong> 체크하세요.
유치 파트너는 내가 올린 매출의 <strong>3%</strong> 협업지원금으로 받습니다.
매니저는 영업파트너 관리하는 역할입니다. 개인 가입 건에 대해 매니저는 요율 아닌 <strong> 구독료</strong> 수당으로 받습니다.
</p>
<div class="mt-3 p-3 bg-orange-50 rounded-lg text-sm">
<p class="text-orange-800">
<strong>예시:</strong> A 파트너가 B 파트너를 유치(소개)했습니다. B 파트너가 개발비 500만원짜리 고객을 데려오면, A 파트너는 협업지원금으로 500만원 &times; 3% = <strong>15만원</strong> 받습니다.
<div class="mt-3 p-3 bg-teal-50 rounded-lg text-sm">
<p class="text-teal-800">
<strong>예시:</strong> 개인 가입 고객의 구독료가 50만원이면, 매니저는 <strong>50만원</strong>( 구독료) 수당으로 받습니다.
</p>
</div>
</div>
@@ -363,9 +360,9 @@ class="inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-70
<p class="text-sm font-semibold text-indigo-800">수당 시뮬레이션 (보라색 영역)</p>
<ul class="text-sm text-indigo-700 mt-2 space-y-1 list-disc list-inside">
<li><span class="inline-block w-2 h-2 rounded-full bg-blue-500 mr-1"></span><strong>영업파트너 수당</strong> &mdash; 내가 직접 받는 수당</li>
<li><span class="inline-block w-2 h-2 rounded-full bg-purple-500 mr-1"></span><strong>매니저 수당</strong> &mdash; 담당 매니저 받는 수당 (단체 가입 0%)</li>
<li><span class="inline-block w-2 h-2 rounded-full bg-orange-500 mr-1"></span><strong>협업지원금</strong> &mdash; 나를 유치한 파트너 받는 수당 (체크 시에만 )</li>
<li><strong> 수당 지급</strong> &mdash; 가지를 모두 합한 금액</li>
<li><span class="inline-block w-2 h-2 rounded-full bg-purple-500 mr-1"></span><strong>유치 파트너 수당</strong> &mdash; 나를 유치한 파트너 받는 수당 (개인 가입 5%)</li>
<li><span class="inline-block w-2 h-2 rounded-full bg-teal-500 mr-1"></span><strong>매니저 수당</strong> &mdash; 담당 매니저 받는 수당 ( 구독료, 개인 가입 )</li>
<li><strong> 수당 지급</strong> &mdash; 항목을 모두 합한 금액</li>
<li><strong>본사 순수익</strong> &mdash; 개발비에서 수당을 나머지 (본사 )</li>
</ul>
</div>
@@ -422,10 +419,12 @@ class="inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-70
<div class="grid gap-1 text-sm" style="display: grid; grid-template-columns: 1fr 1fr;">
<span class="text-gray-600">영업파트너 수당 (20%)</span>
<span class="text-right font-bold text-blue-600">100만원</span>
<span class="text-gray-600">매니저 수당 (5%)</span>
<span class="text-gray-600">유치 파트너 수당 (5%)</span>
<span class="text-right font-bold text-purple-600">25만원</span>
<span class="text-gray-600">매니저 수당 ( 구독료)</span>
<span class="text-right font-bold text-teal-600">50만원</span>
<span class="text-gray-600">본사 순수익</span>
<span class="text-right font-bold text-emerald-600">375만원</span>
<span class="text-right font-bold text-emerald-600">325만원</span>
</div>
</div>
</div>
@@ -433,12 +432,12 @@ class="inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-70
<div class="bg-white rounded-xl p-5 border border-gray-100">
<h3 class="font-bold text-gray-900 mb-2">예시 2: 기본 패키지 + 품질관리 (단체 가입)</h3>
<p class="text-sm text-gray-500 mb-4">협회를 통해 회원사 5곳이 동시에 가입하는 상황. 유치 파트너(협회장) 있음.</p>
<p class="text-sm text-gray-500 mb-4">협회를 통해 회원사 5곳이 동시에 가입하는 상황.</p>
<div class="space-y-3">
<div class="p-3 bg-gray-50 rounded-lg">
<p class="text-xs font-semibold text-gray-500 mb-2">STEP 1. 설정</p>
<p class="text-sm text-gray-700">가입 유형: <strong>단체 가입</strong> / 유치 파트너: <strong>있음 (체크)</strong></p>
<p class="text-sm text-gray-700">가입 유형: <strong>단체 가입</strong></p>
</div>
<div class="p-3 bg-gray-50 rounded-lg">
<p class="text-xs font-semibold text-gray-500 mb-2">STEP 2. 상품 선택</p>
@@ -453,10 +452,6 @@ class="inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-70
<div class="grid gap-1 text-sm" style="display: grid; grid-template-columns: 1fr 1fr;">
<span class="text-gray-600">단체 수당 (30%)</span>
<span class="text-right font-bold text-green-600">300만원</span>
<span class="text-gray-600">매니저 수당</span>
<span class="text-right font-bold text-gray-400">0</span>
<span class="text-gray-600">협업지원금 (3%)</span>
<span class="text-right font-bold text-orange-600">30만원</span>
</div>
<div class="border-t border-indigo-200 mt-2 pt-2">
<p class="text-sm text-gray-700">5개사 동시 가입 단체 수당: <strong class="text-green-600">1,500만원</strong></p>
@@ -538,7 +533,7 @@ class="inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-70
<p class="font-semibold text-gray-900 text-sm">Q. 개인 가입과 단체 가입, 어떤 유리한가요?</p>
</div>
<div class="px-5 py-3">
<p class="text-sm text-gray-700"><strong>상황에 따라 다릅니다.</strong> 개인 가입(20%) 수당률이 낮지만 매니저 수당(5%) 별도로 나갑니다. 단체 가입(30%) 수당률이 매니저 수당이 습니다. 고객이 단체(법인/협회)라면 단체 가입이 유리하고, 개별 사업자라면 개인 가입을 선택하세요.</p>
<p class="text-sm text-gray-700"><strong>상황에 따라 다릅니다.</strong> 개인 가입 파트너 20% + 유치 파트너 5%이고 매니저에게 구독료가 지급됩니다. 단체 가입 30% 수당률이 높습니다. 고객이 단체(법인/협회)라면 단체 가입이 유리하고, 개별 사업자라면 개인 가입을 선택하세요.</p>
</div>
</div>
@@ -618,20 +613,7 @@ class="inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-70
</div>
<div class="bg-white rounded-xl p-5 border border-gray-100">
<h3 class="font-bold text-gray-900 mb-3">3. 무료 체험 기간</h3>
<p class="text-sm text-gray-700 leading-relaxed mb-2">
서비스 시작 <strong> 1주일(7) 구독료를 면제</strong> 있습니다.
</p>
<div class="bg-gray-50 rounded-lg p-4 text-sm space-y-2">
<p class="text-gray-600">: 무료 체험 적용 </p>
<p class="text-gray-600"> 7: 구독료 0 / 8일째부터: 구독료 정상 부과</p>
<p class="text-gray-600"> 1년차 비용 = 개발비 + <strong>11.75개월</strong> 구독료</p>
<p class="text-gray-500 text-xs mt-1">선택 가능: 없음, 1주일(7)</p>
</div>
</div>
<div class="bg-white rounded-xl p-5 border border-gray-100">
<h3 class="font-bold text-gray-900 mb-3">4. 프로모션 메모</h3>
<h3 class="font-bold text-gray-900 mb-3">3. 프로모션 메모</h3>
<p class="text-sm text-gray-700 leading-relaxed">
적용하는 프로모션의 <strong>이름이나 사유</strong> 메모할 있습니다.
비용 요약 하단에 메모가 표시되어, 나중에 어떤 프로모션을 적용했는지 기억하기 쉽습니다.
@@ -666,14 +648,12 @@ class="inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-70
<p class="font-semibold text-blue-800 mb-1">시나리오: 대형 제조업체 신규 계약</p>
<p>상품 3 선택 개발비 합계 800만원</p>
<p>추가 할인: 10% 개발비 720만원</p>
<p>무료 체험: 2개월</p>
<p class="font-medium mt-1"> 1년차 비용 크게 절감, 수당은 720만원 기준 계산</p>
</div>
<div class="bg-white rounded-lg p-3 border border-blue-100">
<p class="font-semibold text-blue-800 mb-1">시나리오: 소규모 업체 부담 완화</p>
<p>필수 상품만 선택 개발비 300만원</p>
<p>구독료 할인: 20%</p>
<p>무료 체험: 3개월</p>
<p class="font-medium mt-1"> 초기 부담 최소화로 계약 유도</p>
</div>
</div>
@@ -699,7 +679,7 @@ class="inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-70
x-on:click="signupType = 'individual'">
<div class="text-2xl mb-1">&#x1F464;</div>
<div class="font-semibold" :class="signupType === 'individual' ? 'text-white' : 'text-gray-900'">개인 가입</div>
<div class="text-xs mt-1" :class="signupType === 'individual' ? 'text-emerald-100' : 'text-gray-500'">파트너 20% + 매니저 5%</div>
<div class="text-xs mt-1" :class="signupType === 'individual' ? 'text-emerald-100' : 'text-gray-500'">파트너 20% + 유치 파트너 5%</div>
</div>
<div class="flex-1 cursor-pointer p-4 border-2 rounded-xl text-center transition-all"
:class="signupType === 'group'
@@ -708,15 +688,9 @@ class="inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-70
x-on:click="signupType = 'group'">
<div class="text-2xl mb-1">&#x1F465;</div>
<div class="font-semibold" :class="signupType === 'group' ? 'text-white' : 'text-gray-900'">단체 가입</div>
<div class="text-xs mt-1" :class="signupType === 'group' ? 'text-emerald-100' : 'text-gray-500'">단체 30% + 매니저 0%</div>
<div class="text-xs mt-1" :class="signupType === 'group' ? 'text-emerald-100' : 'text-gray-500'">단체 30%</div>
</div>
</div>
{{-- 유치파트너(협업지원금) 토글 --}}
<label class="flex items-center gap-2 mt-3 cursor-pointer">
<input type="checkbox" x-model="hasReferrer"
class="w-4 h-4 rounded border-gray-300 text-emerald-600 focus:ring-emerald-500">
<span class="text-sm text-gray-700">유치 파트너 있음 <span class="text-gray-400">(협업지원금 3%)</span></span>
</label>
</div>
{{-- 업종 카테고리 선택 --}}
@@ -977,30 +951,6 @@ class="w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer accent-o
</template>
</div>
{{-- 무료 체험 기간 (1주일 고정) --}}
<div class="border-t border-gray-100 pt-4">
<label class="block text-sm font-medium text-gray-700 mb-2">무료 체험 (1주일)</label>
<div class="flex gap-2 flex-wrap">
<button type="button" x-on:click="promoFreeTrial = false"
class="px-3 py-1.5 text-xs rounded-lg transition-colors border"
:class="!promoFreeTrial
? 'bg-orange-500 text-white border-orange-500'
: 'bg-white text-gray-600 border-gray-200 hover:border-orange-300'">
없음
</button>
<button type="button" x-on:click="promoFreeTrial = true"
class="px-3 py-1.5 text-xs rounded-lg transition-colors border"
:class="promoFreeTrial
? 'bg-orange-500 text-white border-orange-500'
: 'bg-white text-gray-600 border-gray-200 hover:border-orange-300'">
1주일 (7)
</button>
</div>
<p class="text-xs text-gray-400 mt-1" x-show="promoFreeTrial">
7일간 구독료가 면제됩니다
</p>
</div>
{{-- 프로모션 메모 --}}
<div class="border-t border-gray-100 pt-4">
<label class="block text-sm font-medium text-gray-700 mb-2">프로모션 메모 (선택)</label>
@@ -1023,9 +973,6 @@ class="w-full px-3 py-2 text-sm border border-gray-200 rounded-lg focus:ring-2 f
<p class="text-xs text-gray-600" x-show="promoSubscriptionPercent > 0">
<span class="text-orange-500 mr-1">&#10003;</span> 구독료 <span x-text="promoSubscriptionPercent + '% 할인'"></span>
</p>
<p class="text-xs text-gray-600" x-show="promoFreeMonths > 0">
<span class="text-orange-500 mr-1">&#10003;</span> 구독료 <span x-text="promoFreeMonths + '개월 무료'"></span>
</p>
</div>
{{-- 초기화 버튼 --}}
@@ -1102,11 +1049,6 @@ class="w-full py-2 text-xs text-gray-500 bg-gray-50 hover:bg-gray-100 rounded-lg
</span>
<span class="font-semibold text-gray-900" x-text="formatCurrency(finalSubscriptionFee()) + '/월'"></span>
</div>
{{-- 무료 체험 기간 안내 --}}
<div class="flex justify-between items-center text-xs" x-show="promoFreeTrial">
<span class="text-orange-500">무료 체험</span>
<span class="text-orange-600 font-medium"> 1주일(7) 무료</span>
</div>
{{-- 구독료 --}}
<div class="flex justify-between items-center text-sm">
<span class="text-gray-500"> 구독료</span>
@@ -1122,9 +1064,6 @@ class="w-full py-2 text-xs text-gray-500 bg-gray-50 hover:bg-gray-100 rounded-lg
</div>
<p class="text-xs text-gray-400 text-right mt-1">
개발비 + 12개월 구독료 (VAT 별도)
<template x-if="promoFreeTrial">
<span class="text-orange-500"> | 1주일 무료 체험 적용</span>
</template>
</p>
{{-- 프로모션 미적용 대비 절감액 --}}
<div class="flex justify-between items-center mt-2 text-xs" x-show="hasAnyPromo()">
@@ -1173,27 +1112,26 @@ class="w-full py-2 text-xs text-gray-500 bg-gray-50 hover:bg-gray-100 rounded-lg
<span class="text-xs text-gray-400 ml-1" x-text="'(' + partnerRate() + '%)'"></span>
</div>
</div>
{{-- 매니저 수당 --}}
<div class="flex justify-between items-center text-sm">
{{-- 유치 파트너 수당 (개인 가입 5%) --}}
<div class="flex justify-between items-center text-sm" x-show="signupType === 'individual'">
<div class="flex items-center gap-2">
<span class="w-2 h-2 rounded-full bg-purple-500"></span>
<span class="text-gray-600">유치 파트너 수당</span>
</div>
<div class="text-right">
<span class="font-semibold text-purple-600" x-text="formatCurrency(referralPartnerCommission())"></span>
<span class="text-xs text-gray-400 ml-1">(5%)</span>
</div>
</div>
{{-- 매니저 수당 (개인 가입 구독료) --}}
<div class="flex justify-between items-center text-sm" x-show="signupType === 'individual'">
<div class="flex items-center gap-2">
<span class="w-2 h-2 rounded-full bg-teal-500"></span>
<span class="text-gray-600">매니저 수당</span>
</div>
<div class="text-right">
<span class="font-semibold" :class="managerRate() > 0 ? 'text-purple-600' : 'text-gray-300'"
x-text="formatCurrency(managerCommission())"></span>
<span class="text-xs text-gray-400 ml-1" x-text="'(' + managerRate() + '%)'"></span>
</div>
</div>
{{-- 유치 수당 --}}
<div class="flex justify-between items-center text-sm" x-show="hasReferrer">
<div class="flex items-center gap-2">
<span class="w-2 h-2 rounded-full bg-orange-500"></span>
<span class="text-gray-600">협업지원금 (유치)</span>
</div>
<div class="text-right">
<span class="font-semibold text-orange-600" x-text="formatCurrency(referrerCommission())"></span>
<span class="text-xs text-gray-400 ml-1">(3%)</span>
<span class="font-semibold text-teal-600" x-text="formatCurrency(managerCommission())"></span>
<span class="text-xs text-gray-400 ml-1">( 구독료)</span>
</div>
</div>
</div>
@@ -1282,7 +1220,6 @@ function buildRequiredSelected(catId) {
showHelp: false,
showPromo: false,
signupType: 'individual',
hasReferrer: false,
selectedCategoryId: firstCategoryId,
selected: buildRequiredSelected(firstCategoryId),
@@ -1294,8 +1231,6 @@ function buildRequiredSelected(catId) {
promoRegistrationAmount: 0,
promoWaiveRegistration: false,
promoSubscriptionPercent: 0,
promoFreeTrial: false,
promoFreeMonths: 0,
promoNote: '',
// --- 카테고리 선택 (상호 배타) ---
@@ -1423,8 +1358,7 @@ function buildRequiredSelected(catId) {
hasAnyPromo() {
return this.promoWaiveRegistration
|| this.promoRegistrationAmount > 0
|| this.promoSubscriptionPercent > 0
|| this.promoFreeTrial;
|| this.promoSubscriptionPercent > 0;
},
promoDevDiscountMax() {
@@ -1487,12 +1421,7 @@ function buildRequiredSelected(catId) {
},
annualSubscriptionFee() {
const annual = this.finalSubscriptionFee() * 12;
if (this.promoFreeTrial) {
// 1주일(7일) 무료: 월 구독료의 7/30 차감
return Math.round(annual - this.finalSubscriptionFee() * 7 / 30);
}
return annual;
return this.finalSubscriptionFee() * 12;
},
totalFirstYearCost() {
@@ -1531,8 +1460,6 @@ function buildRequiredSelected(catId) {
this.promoRegistrationAmount = 0;
this.promoWaiveRegistration = false;
this.promoSubscriptionPercent = 0;
this.promoFreeTrial = false;
this.promoFreeMonths = 0;
this.promoNote = '';
},
@@ -1541,10 +1468,6 @@ function buildRequiredSelected(catId) {
return this.signupType === 'individual' ? 20 : 30;
},
managerRate() {
return this.signupType === 'individual' ? 5 : 0;
},
commissionBaseAmount() {
return this.finalRegistrationFee();
},
@@ -1553,17 +1476,20 @@ function buildRequiredSelected(catId) {
return Math.floor(this.commissionBaseAmount() * this.partnerRate() / 100);
},
managerCommission() {
return Math.floor(this.commissionBaseAmount() * this.managerRate() / 100);
referralPartnerCommission() {
// 개인 가입: 유치 파트너 5%, 단체 가입: 0% (비공식 3%는 표시 안 함)
if (this.signupType !== 'individual') return 0;
return Math.floor(this.commissionBaseAmount() * 5 / 100);
},
referrerCommission() {
if (!this.hasReferrer) return 0;
return Math.floor(this.commissionBaseAmount() * 3 / 100);
managerCommission() {
// 개인 가입: 첫 달 구독료, 단체 가입: 0
if (this.signupType !== 'individual') return 0;
return this.finalSubscriptionFee();
},
totalCommission() {
return this.partnerCommission() + this.managerCommission() + this.referrerCommission();
return this.partnerCommission() + this.referralPartnerCommission() + this.managerCommission();
},
companyNetRevenue() {
@@ -1610,7 +1536,6 @@ function buildRequiredSelected(catId) {
resetAll() {
this.signupType = 'individual';
this.hasReferrer = false;
this.linkedPricing = false;
this.selectedCategoryId = firstCategoryId;
this.selected = buildRequiredSelected(firstCategoryId);