/**
* Класс для расчета инвестиционного потенциала
*/
class OpportunityCalculator {
constructor() {
// Настройки доходности (в годовых %)
this.strategies = {
cash: 2, // "Под подушкой" (условно инфляция съедает, но оставим номинал)
deposit: 15, // Вклад
business: 20, // Бизнес/Облигации
realEstate: 30 // Наша целевая доходность с агентством
};
}
/**
* Расчет сложного процента с пополнениями
* @param {number} startSum - стартовый капитал
* @param {number} monthlyAdd - ежемесячное пополнение
* @param {number} years - срок в годах
* @param {number} rateYear - годовая ставка в %
* @returns {number} итоговая сумма
*/
calculateCompoundInterest(startSum, monthlyAdd, years, rateYear) {
const months = years * 12;
const rateMonth = rateYear / 100 / 12;
let futureValue = startSum * Math.pow(1 + rateMonth, months);
// Формула аннуитета для ежемесячных пополнений
// FV = PMT * (((1 + r)^n - 1) / r)
if (rateMonth > 0) {
futureValue += monthlyAdd * ((Math.pow(1 + rateMonth, months) - 1) / rateMonth);
} else {
futureValue += monthlyAdd * months;
}
return Math.round(futureValue);
}
/**
* Основной метод расчета отчета
*/
generateReport(input) {
const currentStrategyRate = this.strategies[input.currentStrategyKey] || 0;
// 1. Сколько будет денег, если ничего не менять
const currentResult = this.calculateCompoundInterest(
input.startSum,
input.monthlyAdd,
input.years,
currentStrategyRate
);
// 2. Сколько будет денег с недвижимостью (Агентство)
const targetResult = this.calculateCompoundInterest(
input.startSum,
input.monthlyAdd,
input.years,
this.strategies.realEstate
);
// 3. Упущенная выгода
const lostProfit = targetResult - currentResult;
// 4. Пассивный доход (упрощенно: считаем, что капитал приносит 10% ренты в год "на руки" после формирования портфеля)
// Либо можно считать withdrawal rate 4-5%
const passiveIncomeCurrent = Math.round((currentResult * 0.10) / 12);
const passiveIncomeTarget = Math.round((targetResult * 0.10) / 12);
return {
currentResult,
targetResult,
lostProfit,
passiveIncomeCurrent,
passiveIncomeTarget,
isGoalReached: passiveIncomeTarget >= input.desiredPassiveIncome
};
}
}
// Пример использования
const calculator = new OpportunityCalculator();
// Данные из формы (пример)
const userData = {
startSum: 2000000, // 2 млн руб
monthlyAdd: 100000, // 100 тыс руб/мес
currentStrategyKey: 'deposit', // Сейчас на вкладе
years: 10, // Горизонт 10 лет
desiredPassiveIncome: 300000 // Хочет 300к в месяц
};
const report = calculator.generateReport(userData);
console.log("--- РЕЗУЛЬТАТЫ РАСЧЕТА ---");
console.log(`Ваш результат через ${userData.years} лет (сейчас): ${report.currentResult.toLocaleString('ru-RU')} ₽`);
console.log(`Ваш результат с недвижимостью: ${report.targetResult.toLocaleString('ru-RU')} ₽`);
console.log(`УПУЩЕННАЯ ВЫГОДА: ${report.lostProfit.toLocaleString('ru-RU')} ₽`);
console.log(`Пассивный доход (сейчас): ${report.passiveIncomeCurrent.toLocaleString('ru-RU')} ₽/мес`);
console.log(`Пассивный доход (с нами): ${report.passiveIncomeTarget.toLocaleString('ru-RU')} ₽/мес`);
// Проверка на корректность ввода (валидация)
if (userData.startSum < 0 || userData.monthlyAdd < 0) {
console.error("Суммы не могут быть отрицательными");
}