/** * Класс для расчета инвестиционного потенциала */ 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("Суммы не могут быть отрицательными"); }
Made on
Tilda