// ------------------------------------------------ private void OnCalculate(object sender, RoutedEventArgs e) { double reader; if (!string.IsNullOrEmpty(tbLoanAmount.Text) && double.TryParse(tbLoanAmount.Text, out reader) && reader > 0) { var svc = new AmortSvc(); var req = new CalculateAmortizationRequest(); // ---------------------------------------------------------------------- // Reader got the Loan Amount value in order to get into this code block. req.LoanAmount = reader; if (double.TryParse(tbTax.Text, out reader)) { req.AnnualTax = reader; } if (double.TryParse(tbAPR.Text, out reader)) { req.InterestRate = reader; } if (double.TryParse(tbPeriod.Text, out reader)) { req.NumberOfPayments = reader; } if (double.TryParse(tbDownPayment.Text, out reader)) { req.DownPayment = reader; } if (double.TryParse(tbAltPmt.Text, out reader)) { req.AlternatePaymentAmt = reader; } if (double.TryParse(tbInsurance.Text, out reader)) { req.AnnualInsurancePmt = reader; } int intReader; if (int.TryParse(tbAltStart.Text, out intReader)) { req.AlternatePaymentNo = intReader; } response = svc.CalculateAmortization(req); var totalPayments = 0d; var totalInterest = 0d; var totalInsurance = 0d; var totalTax = 0d; var totalPrinciple = 0d; foreach (var detail in response.PaymentDetails) { totalPayments += detail.Payment; totalInterest += detail.Interest; totalInsurance += detail.Insurance; totalTax += detail.Tax; totalPrinciple += detail.Principle; } dgOut.ItemsSource = response.PaymentDetails; tbTotalTax.Text = totalTax.ToString("c"); tbTotalPayments.Text = totalPayments.ToString("c"); tbTotalInterest.Text = totalInterest.ToString("c"); tbTotalInsurance.Text = totalInsurance.ToString("c"); tbNumberOfPayments.Text = response.PaymentDetails.Count.ToString(); btnPrint.IsEnabled = true; } }
// ------------------------------------------------ public CalculateAmortizationResponse CalculateAmortization(CalculateAmortizationRequest req) { var retVal = new CalculateAmortizationResponse(); var rate = req.InterestRate; var loanAmount = req.LoanAmount - req.DownPayment; // --------------------------------------------------------- // Tax and Insurance are constant, and are simply the Annual // amount spread over twelve months. var tax = (req.AnnualTax / 12); var insurance = (req.AnnualInsurancePmt / 12); var balance = req.LoanAmount; var payment = (double)CalculatePayment(new CalculatePaymentRequest(req)).PaymentAmount; var paymentNo = 0; while (balance != 0 && balance > 0) { if (req.AlternatePaymentAmt > 0) { if (paymentNo >= req.AlternatePaymentNo) { payment = req.AlternatePaymentAmt; } } // ------------------------------------------------------ // calculate interest rate based on remaining loan amount var interest = (loanAmount * rate) / 12; if (loanAmount < payment) { payment = loanAmount + interest + tax + insurance; } // ------------------------------------------------------------------- // calculate principle by subtracting the interest, tax, and insurance var principle = payment - interest - tax - insurance; // ----------------------------------------------------------------------- // The new loan amount is the old loan amount minus the principal payment. loanAmount -= principle; balance = (int)loanAmount; // ----------------------------------------------- // prevent a negative number once loan is paid off if (balance <= 0) { loanAmount = 0; } var detail = new PaymentDetail(); detail.PaymentNo = ++paymentNo; detail.Tax = Math.Round(tax, 2); detail.Payment = Math.Round(payment, 2); detail.Interest = Math.Round(interest, 2); detail.Balance = Math.Round(loanAmount, 2); detail.Principle = Math.Round(principle, 2); detail.Insurance = Math.Round(insurance, 2); retVal.PaymentDetails.Add(detail); } return(retVal); }