/// <summary> /// Расчитывать выплаты. /// X = (S*p) / (1-(1+p)^(1-m)) /// X - размер аннуитетного платежа; /// S - сумма кредита; /// p - 1/12 годовой процентной ставки, выраженная в сотых долях; /// ^ - означает в степени; /// m - срок кредита, в месяцах. /// </summary> /// <param name="amount">Объем долга.</param> /// <param name="interestRate">Процентная ставка.</param> /// <param name="loanTerm">Срок кредита(в месяцах).</param> /// <returns>Выплаты по кредиту.</returns> public IEnumerable<Payment> Calculate( Amount amount, InterestRate interestRate, LoanTerm loanTerm) { if (amount == null || interestRate == null || loanTerm == null) { throw new ArgumentException("Bad params for calculation"); } var payments = new List<Payment>(); var totalBalanceOwed = amount.Value; int number = 0; while (totalBalanceOwed > 0) { var loanPayment = totalBalanceOwed / (loanTerm.Value - number); var percentPayment = totalBalanceOwed * interestRate.Value / (100 * 12); totalBalanceOwed -= loanPayment; var payment = new Payment(number, percentPayment, loanPayment, totalBalanceOwed); payments.Add(payment); number++; } return payments; }
public void TestForOneMonth() { var amount = new Amount() { Value = 100 }; var interestRate = new InterestRate() { Value = 12 }; var loanTerm = new LoanTerm() { Value = 1 }; var payments = this.calculator.Calculate(amount, interestRate, loanTerm); Assert.AreEqual(1, payments.Count()); var payment = payments.FirstOrDefault(); Assert.IsNotNull(payment); Assert.AreEqual(0, payment.Number); Assert.AreEqual(1, payment.PercentPayment); Assert.AreEqual(100, payment.LoanPayment); Assert.AreEqual(0, payment.BalanceOwed); }
public void TestForTwoMonths() { var amount = new Amount() { Value = 100 }; var interestRate = new InterestRate() { Value = 12 }; var loanTerm = new LoanTerm() { Value = 2 }; var payments = this.calculator.Calculate(amount, interestRate, loanTerm); Assert.AreEqual(2, payments.Count()); var firstPayment = payments.FirstOrDefault(item => item.Number == 0); Assert.IsNotNull(firstPayment); Assert.AreEqual(1, firstPayment.PercentPayment); Assert.AreEqual(50, firstPayment.LoanPayment); Assert.AreEqual(50, firstPayment.BalanceOwed); var secondPayment = payments.FirstOrDefault(item => item.Number == 1); Assert.IsNotNull(secondPayment); Assert.AreEqual(0.5m, secondPayment.PercentPayment); Assert.AreEqual(50, secondPayment.LoanPayment); Assert.AreEqual(0, secondPayment.BalanceOwed); }