private static void TestLoanRespaymentCalc() { decimal payment1 = BizLogic.LoanCalcs.CalculatePayment(9500.00M, 7.5M, 52); var lrs = new BizBase.LoanRepaymentSchedule(); var loanAmount = 50000; int numberOfPayments = 52; int installmentCount = 0; decimal payment = Math.Round(BizLogic.LoanCalcs.CalculatePayment(loanAmount, 19M, numberOfPayments), 2); var totalToPay = Math.Round((payment * numberOfPayments), 2); var totalInterest = Math.Round(totalToPay - loanAmount, 2); var interestInstallment = Math.Round(totalInterest / numberOfPayments, 2); decimal loanInstallment = Math.Round((decimal)loanAmount / (decimal)numberOfPayments, 2); decimal principal = loanAmount; var interestPaymentAdjustment = totalInterest - (interestInstallment * numberOfPayments); var prinicpalPaymentAdjustment = loanAmount - (loanInstallment * numberOfPayments); for (int i = 1; i <= 52; i++) { installmentCount++; if (i == 1) { Console.WriteLine("installmentNumber " + i + "amountDue " + totalToPay + "principal " + principal + "interest " + (interestInstallment + interestPaymentAdjustment)); } else { Console.WriteLine("installmentNumber " + i + "amountDue " + totalToPay + "principal " + principal + "interest " + interestInstallment); } totalToPay -= payment; principal -= loanInstallment; //totalInterest -= interestInstallment; lrs.installments.Add(new BizBase.Installment { installmentNumber = i, amountDue = totalToPay , interest = interestInstallment, principal = principal }); } // var json = new JavaScriptSerializer().Serialize(lrs.installments); //foreach (var item in lrs.installments) //{ // Console.WriteLine(item.installmentNumber + " | " + item.amountDue + "|" + "|" + item.numberOfPayments); // var json = new JavaScriptSerializer().Serialize(lrs.installments); //} Console.ReadLine(); }
public static LoanRepaymentSchedule GetRepaymentSchedule(decimal loanAmount, decimal apr, int numberOfPayments) { var lrs = new LoanRepaymentSchedule(); //get periodical payment amount decimal payment = Math.Round(Loans.LoanCalcs.CalculatePayment(loanAmount, apr, numberOfPayments), 2); ///* Do adjustments to cater for rounding 'errors' // Typically the first payment on any loan/DD schedule is slightly different to future payments // */ var loanAdjustments = LoanAdjustment.GetLoanAdjustment(loanAmount, numberOfPayments, payment); decimal principalStillToPay = loanAdjustments.loanInstallment * numberOfPayments; for (int i = 1; i <= numberOfPayments; i++) { if (i == 1) { loanAdjustments.interestInstallment -= loanAdjustments.interestAdjustment; principalStillToPay += loanAdjustments.loanAdjustment; } lrs.installments.Add(new Installment { installmentNumber = i, amountDue = loanAdjustments.totalToPay, principal = principalStillToPay, interest = loanAdjustments.interestInstallment }); loanAdjustments.totalToPay -= payment; principalStillToPay -= loanAdjustments.loanInstallment; } return(lrs); }