public static CalculatePaymentPlanReturnValues CalculatePaymentPlan(CalculatePaymentPlanParameters parameters) { var totalTaxRatio = TotalTaxRatio.Get(parameters.ProductType); var effectiveLoanAmount = EffectiveLoanAmount.Get(parameters.BankCommissionCollectionType, parameters.LoanAmount, parameters.TotalFee); var monthlyInstallment = MonthlyInstallment.Get(new CalculateMonthlyInstallmentParameters { InterestRateAsPercentage = parameters.InterestRateAsPercentage, LoanAmount = parameters.LoanAmount, MaturityInMonths = parameters.MaturityInMonths, ProductType = parameters.ProductType }); var returnValues = new CalculatePaymentPlanReturnValues { PaymentPlan = new List <PaymentPlanItem>(), TotalInstallment = 0, TotalTax = 0, MonthlyInstallment = monthlyInstallment.MonthlyInstallment }; var remainingLoanAmount = effectiveLoanAmount; for (var i = 0; i < parameters.MaturityInMonths; i++) { var paymentPlanItem = new PaymentPlanItem { Period = i + 1, Installment = returnValues.MonthlyInstallment, Interest = remainingLoanAmount * parameters.InterestRateAsPercentage / 100 }; paymentPlanItem.Tax = paymentPlanItem.Interest * totalTaxRatio; paymentPlanItem.Principal = paymentPlanItem.Installment - paymentPlanItem.Interest - paymentPlanItem.Tax; remainingLoanAmount -= paymentPlanItem.Principal; paymentPlanItem.RemainingLoanAmount = remainingLoanAmount; returnValues.PaymentPlan.Add(paymentPlanItem); returnValues.TotalInterest += paymentPlanItem.Interest; returnValues.TotalTax += paymentPlanItem.Tax; } returnValues.TotalInstallment = returnValues.MonthlyInstallment * parameters.MaturityInMonths; returnValues.TotalPayback = TotalPayback.Get(parameters.BankCommissionCollectionType, returnValues.MonthlyInstallment, parameters.MaturityInMonths, parameters.TotalFee); return(returnValues); }
public void CalculatePaymentPlanShouldWorkCorrectly() { //Arrange var @object = new CalculatePaymentPlanParameters { LoanAmount = 60000, InterestRateAsPercentage = 1.2, ProductType = ProductType.PersonalLoan, MaturityInMonths = 48, BankCommissionCollectionType = BankCommissionCollectionTypes.BankCommissionSubtractedFromPrincipalAtFirst }; //Act var sut = PaymentPlan.CalculatePaymentPlan(@object); //Assert sut.PaymentPlan.Should().NotBeEmpty(); }