introduce investment models
This commit is contained in:
parent
8ab864e444
commit
626badffe9
2 changed files with 181 additions and 27 deletions
|
|
@ -48,9 +48,12 @@ class ROICalculator {
|
||||||
}
|
}
|
||||||
|
|
||||||
getInputValues() {
|
getInputValues() {
|
||||||
|
const investmentModel = document.querySelector('input[name="investment-model"]:checked').value;
|
||||||
return {
|
return {
|
||||||
investmentAmount: parseFloat(document.getElementById('investment-amount').getAttribute('data-value')),
|
investmentAmount: parseFloat(document.getElementById('investment-amount').getAttribute('data-value')),
|
||||||
timeframe: parseInt(document.getElementById('timeframe').value),
|
timeframe: parseInt(document.getElementById('timeframe').value),
|
||||||
|
investmentModel: investmentModel,
|
||||||
|
loanInterestRate: parseFloat(document.getElementById('loan-interest-rate').value) / 100,
|
||||||
revenuePerInstance: parseFloat(document.getElementById('revenue-per-instance').value),
|
revenuePerInstance: parseFloat(document.getElementById('revenue-per-instance').value),
|
||||||
servalaShare: parseFloat(document.getElementById('servala-share').value) / 100,
|
servalaShare: parseFloat(document.getElementById('servala-share').value) / 100,
|
||||||
gracePeriod: parseInt(document.getElementById('grace-period').value)
|
gracePeriod: parseInt(document.getElementById('grace-period').value)
|
||||||
|
|
@ -61,15 +64,30 @@ class ROICalculator {
|
||||||
const scenario = this.scenarios[scenarioKey];
|
const scenario = this.scenarios[scenarioKey];
|
||||||
if (!scenario.enabled) return null;
|
if (!scenario.enabled) return null;
|
||||||
|
|
||||||
// Calculate investment scaling factor
|
// Calculate loan payment if using loan model
|
||||||
|
let monthlyLoanPayment = 0;
|
||||||
|
if (inputs.investmentModel === 'loan') {
|
||||||
|
const monthlyRate = inputs.loanInterestRate / 12;
|
||||||
|
const numPayments = inputs.timeframe * 12;
|
||||||
|
// Calculate fixed monthly payment using amortization formula
|
||||||
|
if (monthlyRate > 0) {
|
||||||
|
monthlyLoanPayment = inputs.investmentAmount *
|
||||||
|
(monthlyRate * Math.pow(1 + monthlyRate, numPayments)) /
|
||||||
|
(Math.pow(1 + monthlyRate, numPayments) - 1);
|
||||||
|
} else {
|
||||||
|
monthlyLoanPayment = inputs.investmentAmount / numPayments;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate investment scaling factor (only for direct investment)
|
||||||
// Base investment of CHF 500,000 = 1.0x multiplier
|
// Base investment of CHF 500,000 = 1.0x multiplier
|
||||||
// Higher investments get multiplicative benefits for instance acquisition
|
// Higher investments get multiplicative benefits for instance acquisition
|
||||||
const baseInvestment = 500000;
|
const baseInvestment = 500000;
|
||||||
const investmentScaleFactor = Math.sqrt(inputs.investmentAmount / baseInvestment);
|
const investmentScaleFactor = inputs.investmentModel === 'loan' ? 1.0 : Math.sqrt(inputs.investmentAmount / baseInvestment);
|
||||||
|
|
||||||
// Calculate churn reduction factor based on investment
|
// Calculate churn reduction factor based on investment (only for direct investment)
|
||||||
// Higher investment = better customer success = lower churn
|
// Higher investment = better customer success = lower churn
|
||||||
const churnReductionFactor = Math.max(0.7, 1 - (inputs.investmentAmount - baseInvestment) / 2000000 * 0.3);
|
const churnReductionFactor = inputs.investmentModel === 'loan' ? 1.0 : Math.max(0.7, 1 - (inputs.investmentAmount - baseInvestment) / 2000000 * 0.3);
|
||||||
|
|
||||||
// Calculate adjusted churn rate with investment-based reduction
|
// Calculate adjusted churn rate with investment-based reduction
|
||||||
const adjustedChurnRate = scenario.churnRate * churnReductionFactor;
|
const adjustedChurnRate = scenario.churnRate * churnReductionFactor;
|
||||||
|
|
@ -102,11 +120,19 @@ class ROICalculator {
|
||||||
// Update total instances
|
// Update total instances
|
||||||
currentInstances = currentInstances + newInstances - churnedInstances;
|
currentInstances = currentInstances + newInstances - churnedInstances;
|
||||||
|
|
||||||
// Calculate revenue
|
// Calculate revenue based on investment model
|
||||||
const monthlyRevenue = currentInstances * inputs.revenuePerInstance;
|
let cspRevenue, servalaRevenue, monthlyRevenue;
|
||||||
|
|
||||||
|
if (inputs.investmentModel === 'loan') {
|
||||||
|
// Loan model: CSP receives fixed monthly loan payment
|
||||||
|
cspRevenue = monthlyLoanPayment;
|
||||||
|
servalaRevenue = 0;
|
||||||
|
monthlyRevenue = monthlyLoanPayment;
|
||||||
|
} else {
|
||||||
|
// Direct investment model: Revenue based on instances
|
||||||
|
monthlyRevenue = currentInstances * inputs.revenuePerInstance;
|
||||||
|
|
||||||
// Determine revenue split based on grace period
|
// Determine revenue split based on grace period
|
||||||
let cspRevenue, servalaRevenue;
|
|
||||||
if (month <= inputs.gracePeriod) {
|
if (month <= inputs.gracePeriod) {
|
||||||
cspRevenue = monthlyRevenue;
|
cspRevenue = monthlyRevenue;
|
||||||
servalaRevenue = 0;
|
servalaRevenue = 0;
|
||||||
|
|
@ -114,6 +140,7 @@ class ROICalculator {
|
||||||
cspRevenue = monthlyRevenue * (1 - inputs.servalaShare);
|
cspRevenue = monthlyRevenue * (1 - inputs.servalaShare);
|
||||||
servalaRevenue = monthlyRevenue * inputs.servalaShare;
|
servalaRevenue = monthlyRevenue * inputs.servalaShare;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Update cumulative revenue
|
// Update cumulative revenue
|
||||||
cumulativeCSPRevenue += cspRevenue;
|
cumulativeCSPRevenue += cspRevenue;
|
||||||
|
|
@ -148,6 +175,7 @@ class ROICalculator {
|
||||||
|
|
||||||
return {
|
return {
|
||||||
scenario: scenario.name,
|
scenario: scenario.name,
|
||||||
|
investmentModel: inputs.investmentModel,
|
||||||
finalInstances: currentInstances,
|
finalInstances: currentInstances,
|
||||||
totalRevenue,
|
totalRevenue,
|
||||||
cspRevenue: cumulativeCSPRevenue,
|
cspRevenue: cumulativeCSPRevenue,
|
||||||
|
|
@ -341,9 +369,14 @@ class ROICalculator {
|
||||||
tbody.innerHTML = '';
|
tbody.innerHTML = '';
|
||||||
|
|
||||||
Object.values(this.results).forEach(result => {
|
Object.values(this.results).forEach(result => {
|
||||||
|
const modelLabel = result.investmentModel === 'loan' ?
|
||||||
|
'<span class="badge bg-warning">Loan</span>' :
|
||||||
|
'<span class="badge bg-success">Direct</span>';
|
||||||
|
|
||||||
const row = tbody.insertRow();
|
const row = tbody.insertRow();
|
||||||
row.innerHTML = `
|
row.innerHTML = `
|
||||||
<td><strong>${result.scenario}</strong></td>
|
<td><strong>${result.scenario}</strong></td>
|
||||||
|
<td>${modelLabel}</td>
|
||||||
<td>${result.finalInstances.toLocaleString()}</td>
|
<td>${result.finalInstances.toLocaleString()}</td>
|
||||||
<td>${this.formatCurrencyDetailed(result.totalRevenue)}</td>
|
<td>${this.formatCurrencyDetailed(result.totalRevenue)}</td>
|
||||||
<td>${this.formatCurrencyDetailed(result.cspRevenue)}</td>
|
<td>${this.formatCurrencyDetailed(result.cspRevenue)}</td>
|
||||||
|
|
@ -690,9 +723,13 @@ function exportToPDF() {
|
||||||
const params = [
|
const params = [
|
||||||
['Investment Amount:', calculator.formatCurrencyDetailed(inputs.investmentAmount)],
|
['Investment Amount:', calculator.formatCurrencyDetailed(inputs.investmentAmount)],
|
||||||
['Investment Timeframe:', `${inputs.timeframe} years`],
|
['Investment Timeframe:', `${inputs.timeframe} years`],
|
||||||
|
['Investment Model:', inputs.investmentModel === 'loan' ? 'Loan Model' : 'Direct Investment'],
|
||||||
|
...(inputs.investmentModel === 'loan' ? [['Loan Interest Rate:', `${(inputs.loanInterestRate * 100).toFixed(1)}%`]] : []),
|
||||||
['Revenue per Instance:', calculator.formatCurrencyDetailed(inputs.revenuePerInstance)],
|
['Revenue per Instance:', calculator.formatCurrencyDetailed(inputs.revenuePerInstance)],
|
||||||
|
...(inputs.investmentModel === 'direct' ? [
|
||||||
['Servala Revenue Share:', `${(inputs.servalaShare * 100).toFixed(0)}%`],
|
['Servala Revenue Share:', `${(inputs.servalaShare * 100).toFixed(0)}%`],
|
||||||
['Grace Period:', `${inputs.gracePeriod} months`]
|
['Grace Period:', `${inputs.gracePeriod} months`]
|
||||||
|
] : [])
|
||||||
];
|
];
|
||||||
|
|
||||||
params.forEach(([label, value]) => {
|
params.forEach(([label, value]) => {
|
||||||
|
|
@ -808,16 +845,24 @@ function exportToCSV() {
|
||||||
const inputs = calculator.getInputValues();
|
const inputs = calculator.getInputValues();
|
||||||
csvContent += `Investment Amount,${inputs.investmentAmount}\n`;
|
csvContent += `Investment Amount,${inputs.investmentAmount}\n`;
|
||||||
csvContent += `Timeframe (years),${inputs.timeframe}\n`;
|
csvContent += `Timeframe (years),${inputs.timeframe}\n`;
|
||||||
|
csvContent += `Investment Model,${inputs.investmentModel === 'loan' ? 'Loan Model' : 'Direct Investment'}\n`;
|
||||||
|
if (inputs.investmentModel === 'loan') {
|
||||||
|
csvContent += `Loan Interest Rate (%),${(inputs.loanInterestRate * 100).toFixed(1)}\n`;
|
||||||
|
}
|
||||||
csvContent += `Revenue per Instance,${inputs.revenuePerInstance}\n`;
|
csvContent += `Revenue per Instance,${inputs.revenuePerInstance}\n`;
|
||||||
|
if (inputs.investmentModel === 'direct') {
|
||||||
csvContent += `Servala Share (%),${(inputs.servalaShare * 100).toFixed(0)}\n`;
|
csvContent += `Servala Share (%),${(inputs.servalaShare * 100).toFixed(0)}\n`;
|
||||||
csvContent += `Grace Period (months),${inputs.gracePeriod}\n\n`;
|
csvContent += `Grace Period (months),${inputs.gracePeriod}\n`;
|
||||||
|
}
|
||||||
|
csvContent += '\n';
|
||||||
|
|
||||||
// Add scenario summary
|
// Add scenario summary
|
||||||
csvContent += 'SCENARIO SUMMARY\n';
|
csvContent += 'SCENARIO SUMMARY\n';
|
||||||
csvContent += 'Scenario,Final Instances,Total Revenue,CSP Revenue,Servala Revenue,ROI (%),Break-even (months)\n';
|
csvContent += 'Scenario,Investment Model,Final Instances,Total Revenue,CSP Revenue,Servala Revenue,ROI (%),Break-even (months)\n';
|
||||||
|
|
||||||
Object.values(calculator.results).forEach(result => {
|
Object.values(calculator.results).forEach(result => {
|
||||||
csvContent += `${result.scenario},${result.finalInstances},${result.totalRevenue.toFixed(2)},${result.cspRevenue.toFixed(2)},${result.servalaRevenue.toFixed(2)},${result.roi.toFixed(2)},${result.breakEvenMonth || 'N/A'}\n`;
|
const modelText = result.investmentModel === 'loan' ? 'Loan' : 'Direct';
|
||||||
|
csvContent += `${result.scenario},${modelText},${result.finalInstances},${result.totalRevenue.toFixed(2)},${result.cspRevenue.toFixed(2)},${result.servalaRevenue.toFixed(2)},${result.roi.toFixed(2)},${result.breakEvenMonth || 'N/A'}\n`;
|
||||||
});
|
});
|
||||||
|
|
||||||
csvContent += '\n';
|
csvContent += '\n';
|
||||||
|
|
@ -872,6 +917,9 @@ function resetCalculator() {
|
||||||
investmentInput.value = '500,000';
|
investmentInput.value = '500,000';
|
||||||
document.getElementById('investment-slider').value = 500000;
|
document.getElementById('investment-slider').value = 500000;
|
||||||
document.getElementById('timeframe').value = 3;
|
document.getElementById('timeframe').value = 3;
|
||||||
|
document.getElementById('direct-model').checked = true;
|
||||||
|
document.getElementById('loan-interest-rate').value = 5.0;
|
||||||
|
document.getElementById('loan-rate-slider').value = 5.0;
|
||||||
document.getElementById('revenue-per-instance').value = 50;
|
document.getElementById('revenue-per-instance').value = 50;
|
||||||
document.getElementById('revenue-slider').value = 50;
|
document.getElementById('revenue-slider').value = 50;
|
||||||
document.getElementById('servala-share').value = 25;
|
document.getElementById('servala-share').value = 25;
|
||||||
|
|
@ -890,11 +938,36 @@ function resetCalculator() {
|
||||||
// Reset advanced parameters
|
// Reset advanced parameters
|
||||||
resetAdvancedParameters();
|
resetAdvancedParameters();
|
||||||
|
|
||||||
|
// Reset investment model toggle
|
||||||
|
toggleInvestmentModel();
|
||||||
|
|
||||||
// Recalculate (this will be called by resetAdvancedParameters, but we ensure it happens)
|
// Recalculate (this will be called by resetAdvancedParameters, but we ensure it happens)
|
||||||
updateCalculations();
|
updateCalculations();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Investment model toggle functions
|
||||||
|
function toggleInvestmentModel() {
|
||||||
|
const selectedModel = document.querySelector('input[name="investment-model"]:checked').value;
|
||||||
|
const loanSection = document.getElementById('loan-rate-section');
|
||||||
|
const modelDescription = document.getElementById('model-description');
|
||||||
|
|
||||||
|
if (selectedModel === 'loan') {
|
||||||
|
loanSection.style.display = 'block';
|
||||||
|
modelDescription.textContent = 'Loan Model: Guaranteed returns with fixed monthly payments';
|
||||||
|
} else {
|
||||||
|
loanSection.style.display = 'none';
|
||||||
|
modelDescription.textContent = 'Direct Investment: Higher potential returns based on your sales performance';
|
||||||
|
}
|
||||||
|
|
||||||
|
updateCalculations();
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateLoanRate(value) {
|
||||||
|
document.getElementById('loan-interest-rate').value = value;
|
||||||
|
updateCalculations();
|
||||||
|
}
|
||||||
|
|
||||||
// Logout function
|
// Logout function
|
||||||
function logout() {
|
function logout() {
|
||||||
if (confirm('Are you sure you want to logout?')) {
|
if (confirm('Are you sure you want to logout?')) {
|
||||||
|
|
|
||||||
|
|
@ -56,14 +56,22 @@
|
||||||
<div class="collapsible-content" id="help-section">
|
<div class="collapsible-content" id="help-section">
|
||||||
<div class="help-content">
|
<div class="help-content">
|
||||||
<h6 class="text-primary mb-2"><i class="bi bi-lightbulb"></i> Calculator Overview</h6>
|
<h6 class="text-primary mb-2"><i class="bi bi-lightbulb"></i> Calculator Overview</h6>
|
||||||
<p class="small">This ROI calculator models your investment in the Servala platform by simulating cloud service provider (CSP) business growth over time. It calculates potential returns based on instance growth, churn rates, and revenue sharing with Servala.</p>
|
<p class="small">This ROI calculator models your investment in the Servala platform by simulating cloud service provider (CSP) business growth over time. Choose between lending to Servala (guaranteed returns) or direct platform investment (higher potential returns based on your sales performance).</p>
|
||||||
|
|
||||||
<h6 class="text-primary mb-2 mt-3"><i class="bi bi-gear"></i> Key Parameters</h6>
|
<h6 class="text-primary mb-2 mt-3"><i class="bi bi-gear"></i> Key Parameters</h6>
|
||||||
<div class="small">
|
<div class="small">
|
||||||
<p><strong>Investment Amount:</strong> Your initial capital investment in the Servala platform and infrastructure.</p>
|
<p><strong>Investment Model:</strong> Loan to Servala (fixed returns) vs Direct Investment (performance-based returns).</p>
|
||||||
|
<p><strong>Investment Amount:</strong> Your capital provided to Servala for platform development and infrastructure.</p>
|
||||||
<p><strong>Monthly Revenue per Instance:</strong> The recurring revenue generated from each managed service instance (excl. compute).</p>
|
<p><strong>Monthly Revenue per Instance:</strong> The recurring revenue generated from each managed service instance (excl. compute).</p>
|
||||||
<p><strong>Servala Revenue Share:</strong> Percentage of revenue shared with Servala after the grace period. This is Servala's platform fee.</p>
|
<p><strong>Servala Revenue Share:</strong> Percentage of revenue shared with Servala after the grace period (Direct Investment only).</p>
|
||||||
<p><strong>Grace Period:</strong> Initial months where you keep 100% of revenue before sharing begins with Servala.</p>
|
<p><strong>Grace Period:</strong> Initial months where you keep 100% of revenue before sharing begins with Servala (Direct Investment only).</p>
|
||||||
|
<p><strong>Loan Interest Rate:</strong> Annual interest rate on loan to Servala (Loan Model only).</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h6 class="text-primary mb-2 mt-3"><i class="bi bi-graph-up"></i> Investment Models</h6>
|
||||||
|
<div class="small">
|
||||||
|
<p><strong>Loan Model:</strong> Lend to Servala at fixed interest rate. Lower risk, guaranteed returns, but limited upside.</p>
|
||||||
|
<p><strong>Direct Investment:</strong> Invest directly in platform operations. Higher risk, but unlimited upside based on your sales performance during grace period and beyond.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h6 class="text-primary mb-2 mt-3"><i class="bi bi-graph-up"></i> Growth Scenarios</h6>
|
<h6 class="text-primary mb-2 mt-3"><i class="bi bi-graph-up"></i> Growth Scenarios</h6>
|
||||||
|
|
@ -79,6 +87,7 @@
|
||||||
<p><strong>ROI:</strong> Return on Investment as a percentage of your initial investment.</p>
|
<p><strong>ROI:</strong> Return on Investment as a percentage of your initial investment.</p>
|
||||||
<p><strong>Break-even:</strong> Month when cumulative revenue equals your initial investment.</p>
|
<p><strong>Break-even:</strong> Month when cumulative revenue equals your initial investment.</p>
|
||||||
<p><strong>Churn:</strong> Monthly percentage of instances that stop generating revenue (customer loss).</p>
|
<p><strong>Churn:</strong> Monthly percentage of instances that stop generating revenue (customer loss).</p>
|
||||||
|
<p><strong>Grace Period Advantage:</strong> Direct Investment model benefits significantly from aggressive sales during grace period (100% revenue retention).</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -147,6 +156,52 @@
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Investment Model Selection -->
|
||||||
|
<div class="input-group-custom">
|
||||||
|
<label class="form-label">
|
||||||
|
Investment Model
|
||||||
|
<i class="bi bi-question-circle-fill text-muted ms-1"
|
||||||
|
data-bs-toggle="tooltip"
|
||||||
|
data-bs-placement="top"
|
||||||
|
title="Choose your investment approach: Loan provides guaranteed returns but limited upside. Direct Investment rewards your sales performance with unlimited upside potential."
|
||||||
|
style="cursor: help; font-size: 0.8rem;"></i>
|
||||||
|
</label>
|
||||||
|
<div class="btn-group w-100" role="group">
|
||||||
|
<input type="radio" class="btn-check" name="investment-model" id="loan-model" value="loan" onchange="toggleInvestmentModel()">
|
||||||
|
<label class="btn btn-outline-warning" for="loan-model">
|
||||||
|
<i class="bi bi-bank"></i> Loan Model
|
||||||
|
</label>
|
||||||
|
<input type="radio" class="btn-check" name="investment-model" id="direct-model" value="direct" checked onchange="toggleInvestmentModel()">
|
||||||
|
<label class="btn btn-outline-success" for="direct-model">
|
||||||
|
<i class="bi bi-rocket"></i> Direct Investment
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<small class="text-muted mt-1">
|
||||||
|
<span id="model-description">Direct Investment: Higher potential returns based on your sales performance</span>
|
||||||
|
</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Loan Interest Rate (conditional) -->
|
||||||
|
<div class="input-group-custom" id="loan-rate-section" style="display: none;">
|
||||||
|
<label for="loan-interest-rate">
|
||||||
|
Annual Loan Interest Rate (%)
|
||||||
|
<i class="bi bi-question-circle-fill text-muted ms-1"
|
||||||
|
data-bs-toggle="tooltip"
|
||||||
|
data-bs-placement="top"
|
||||||
|
title="Fixed annual interest rate you receive on the loan to Servala. Provides guaranteed monthly payments but limits upside potential."
|
||||||
|
style="cursor: help; font-size: 0.8rem;"></i>
|
||||||
|
</label>
|
||||||
|
<input type="number" class="form-control" id="loan-interest-rate"
|
||||||
|
min="3" max="8" step="0.1" value="5.0"
|
||||||
|
onchange="updateCalculations()">
|
||||||
|
<div class="slider-container">
|
||||||
|
<input type="range" class="slider" id="loan-rate-slider"
|
||||||
|
min="3" max="8" step="0.1" value="5.0"
|
||||||
|
onchange="updateLoanRate(this.value)">
|
||||||
|
</div>
|
||||||
|
<small class="text-muted">3% - 8% annual (fixed monthly payments)</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="input-group-custom">
|
<div class="input-group-custom">
|
||||||
<label for="revenue-per-instance">Monthly Revenue per Instance</label>
|
<label for="revenue-per-instance">Monthly Revenue per Instance</label>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
|
|
@ -164,7 +219,14 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="input-group-custom">
|
<div class="input-group-custom">
|
||||||
<label for="servala-share">Servala Revenue Share (%)</label>
|
<label for="servala-share">
|
||||||
|
Servala Revenue Share (%)
|
||||||
|
<i class="bi bi-question-circle-fill text-muted ms-1"
|
||||||
|
data-bs-toggle="tooltip"
|
||||||
|
data-bs-placement="top"
|
||||||
|
title="Percentage of revenue shared with Servala after the grace period. Only applies to Direct Investment model."
|
||||||
|
style="cursor: help; font-size: 0.8rem;"></i>
|
||||||
|
</label>
|
||||||
<input type="number" class="form-control" id="servala-share"
|
<input type="number" class="form-control" id="servala-share"
|
||||||
min="10" max="40" step="1" value="25"
|
min="10" max="40" step="1" value="25"
|
||||||
onchange="updateCalculations()">
|
onchange="updateCalculations()">
|
||||||
|
|
@ -173,11 +235,18 @@
|
||||||
min="10" max="40" step="1" value="25"
|
min="10" max="40" step="1" value="25"
|
||||||
onchange="updateServalaShare(this.value)">
|
onchange="updateServalaShare(this.value)">
|
||||||
</div>
|
</div>
|
||||||
<small class="text-muted">10% - 40%</small>
|
<small class="text-muted">10% - 40% (Direct Investment only)</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="input-group-custom">
|
<div class="input-group-custom">
|
||||||
<label for="grace-period">Grace Period (Months)</label>
|
<label for="grace-period">
|
||||||
|
Grace Period (Months)
|
||||||
|
<i class="bi bi-question-circle-fill text-muted ms-1"
|
||||||
|
data-bs-toggle="tooltip"
|
||||||
|
data-bs-placement="top"
|
||||||
|
title="Initial months where you keep 100% of revenue before sharing begins with Servala. Critical for maximizing returns in Direct Investment model."
|
||||||
|
style="cursor: help; font-size: 0.8rem;"></i>
|
||||||
|
</label>
|
||||||
<input type="number" class="form-control" id="grace-period"
|
<input type="number" class="form-control" id="grace-period"
|
||||||
min="0" max="24" step="1" value="6"
|
min="0" max="24" step="1" value="6"
|
||||||
onchange="updateCalculations()">
|
onchange="updateCalculations()">
|
||||||
|
|
@ -186,7 +255,7 @@
|
||||||
min="0" max="24" step="1" value="6"
|
min="0" max="24" step="1" value="6"
|
||||||
onchange="updateGracePeriod(this.value)">
|
onchange="updateGracePeriod(this.value)">
|
||||||
</div>
|
</div>
|
||||||
<small class="text-muted">0 - 24 months (100% revenue to CSP)</small>
|
<small class="text-muted">0 - 24 months (100% revenue to CSP - Direct Investment only)</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -482,6 +551,17 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Investment Model Comparison Chart -->
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="chart-container">
|
||||||
|
<h5><i class="bi bi-graph-up"></i> Investment Model Comparison</h5>
|
||||||
|
<p class="small text-muted mb-3">Compare guaranteed returns from loan model vs performance-based returns from direct investment. Grace period highlighted to show advantage of aggressive sales during 100% revenue retention period.</p>
|
||||||
|
<canvas id="modelComparisonChart"></canvas>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Scenario Comparison Table -->
|
<!-- Scenario Comparison Table -->
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
|
|
@ -492,6 +572,7 @@
|
||||||
<thead class="table-dark">
|
<thead class="table-dark">
|
||||||
<tr>
|
<tr>
|
||||||
<th>Scenario</th>
|
<th>Scenario</th>
|
||||||
|
<th>Investment Model</th>
|
||||||
<th>Final Instances</th>
|
<th>Final Instances</th>
|
||||||
<th>Total Revenue</th>
|
<th>Total Revenue</th>
|
||||||
<th>CSP Revenue</th>
|
<th>CSP Revenue</th>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue