示例#1
0
        public static IEnumerable <InstallmentForRepaymentPlanModel> GetDecreasingPlan(NewLoanRequestModel requestModel)
        {
            var actualPeriod             = requestModel.Period - requestModel.GracePeriod;
            var principalInstallment     = Math.Round(requestModel.LoanAmount / actualPeriod, 2);
            var lastPrincipalInstallment = requestModel.LoanAmount - (actualPeriod - 1) * principalInstallment;
            var installments             = new Dictionary <int, InstallmentForRepaymentPlanModel>();
            var startingFees             = CalcHelpers.CalculateStartingFeesCost(requestModel.LoanAmount, requestModel.Fees);

            var zero = new InstallmentForRepaymentPlanModel
            {
                Id   = 0,
                Date = DateTime.UtcNow.Date,
                MonthlyInstallment   = 0,
                PrincipalInstallment = 0,
                InterestInstallment  = 0,
                PrincipalBalance     = requestModel.LoanAmount,
                Fees     = startingFees,
                CashFlow = requestModel.LoanAmount - startingFees
            };

            installments.Add(0, zero);

            for (var i = 1; i <= requestModel.Period; i++)
            {
                var     interest = i <= requestModel.PromoPeriod ? requestModel.PromoInterest : requestModel.Interest;
                decimal currentPrincipalBalance;
                decimal interestInstallment;
                decimal currentPrincipalInstallment;

                if (i <= requestModel.GracePeriod)
                {
                    currentPrincipalBalance     = requestModel.LoanAmount;
                    interestInstallment         = CalcHelpers.CalculateInterestInstallment(interest, currentPrincipalBalance);
                    currentPrincipalInstallment = 0;
                }
                else
                {
                    currentPrincipalBalance     = CalcHelpers.CalculatePrincipalBalance(installments[i - 1]);
                    interestInstallment         = CalcHelpers.CalculateInterestInstallment(interest, currentPrincipalBalance);
                    currentPrincipalInstallment = i == requestModel.Period ? lastPrincipalInstallment : principalInstallment;
                }

                var monthlyInstallment = interestInstallment + currentPrincipalInstallment;

                var fees = CalcHelpers.CalculateFeesCost(i, currentPrincipalBalance, requestModel.Fees);

                installments.Add(i, new InstallmentForRepaymentPlanModel
                {
                    Id   = i,
                    Date = DateTime.UtcNow.Date.AddDays(i),
                    MonthlyInstallment   = monthlyInstallment,
                    PrincipalInstallment = currentPrincipalInstallment,
                    InterestInstallment  = interestInstallment,
                    PrincipalBalance     = currentPrincipalBalance,
                    Fees     = fees,
                    CashFlow = -monthlyInstallment - fees
                });
            }

            return(installments.Select(x => x.Value));
        }
示例#2
0
 public static decimal CalculatePrincipalBalance(InstallmentForRepaymentPlanModel previousInstallment)
 {
     return(previousInstallment.PrincipalBalance - previousInstallment.PrincipalInstallment);
 }