private void loanPaymentPlanner(LoanItem loanItem)
        {
            int monthsLeft = loanItem.MonthLeft;

            decimal interestRate        = loanItem.Rate;
            decimal originalBalance     = loanItem.Balance;
            decimal remainingBalance    = originalBalance;
            decimal totalMonthlyPayment = getTotalMonthlyPayment(originalBalance, interestRate, monthsLeft); // equal amount is paid every month

            List <PaymentPlanItem> ppiList = new List <PaymentPlanItem>();

            //loops through all months given to repay loanItem and creates a full repayment plan.
            for (int month = 0; month < monthsLeft; month++)
            {
                decimal interestPayment  = getInterestPayment(remainingBalance, interestRate);
                decimal principalPayment = getPrincipalPayment(totalMonthlyPayment, interestPayment);
                //above this line is previous remainingBalance
                remainingBalance = getRemainingBalance(remainingBalance, principalPayment);
                PaymentPlanItem ppi = new PaymentPlanItem(loanItem.Id, month + 1, interestPayment, principalPayment, remainingBalance);

                ppiList.Add(ppi);
            }

            _context.PaymentPlanItems.AddRange(ppiList);
            _context.SaveChanges();
        }
        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 TestContractUpload()
        {
            ContractUploadBuinessService uploadContract = new ContractUploadBuinessService();

            List <Contract> list = new List <Contract>();
            Contract        c    = new Contract();

            c.Amount  = 100;
            c.Comment = "UR1";
            //c.CompletionDate = DateTime.Now;
            c.Currency        = "USD";
            c.CustomerDetails = "Новое ООО Денис";
            c.CustomerId      = 0;
            c.RateCBRPercents = null;
            c.Rate            = 1;
            c.Date            = DateTime.Now;
            c.DateFrom        = DateTime.Now.AddDays(-10);
            c.DateTo          = DateTime.Now.AddDays(10);
            c.ExecutorDetails = "ExecutorDetails";
            c.ExecutorId      = 0;
            c.Id           = "24";
            c.Manager      = "test";
            c.Number       = 212042011;
            c.PaymentTerms = "Условия оплаты";
            c.Prefix       = "GH";
            Contract sc1 = new Contract();

            sc1.Amount          = 5;
            sc1.Comment         = "UR1_sub";
            sc1.CompletionDate  = DateTime.Now;
            sc1.Currency        = "USD";
            sc1.CustomerDetails = "Новое ООО Денис";
            sc1.CustomerId      = 0;
            sc1.Date            = DateTime.Now;
            sc1.DateFrom        = DateTime.Now.AddDays(-10);
            sc1.DateTo          = DateTime.Now.AddDays(10);
            sc1.ExecutorDetails = "ExecutorDetails";
            sc1.ExecutorId      = 0;
            sc1.Id           = "25";
            sc1.Manager      = "test";
            sc1.Number       = 212042011;
            sc1.PaymentTerms = "Условия оплаты";
            sc1.Prefix       = "GH";
            c.Subcontracts   = new List <Contract>()
            {
                sc1
            };
            var pi1 = new PaymentPlanItem()
            {
                Amount       = 10,
                Comment      = "PI1-New",
                Date         = DateTime.Now,
                DateFrom     = DateTime.Now,
                DateTo       = DateTime.Now,
                FromEmployee = 0,
                ToEmployee   = 0,
                Id           = 10050217,
                Number       = 100,
                PaymentTerms = "PT1-000",
                Prefix       = "P1",
                FactPay      = true,
                DogId        = "02042012"
            };
            var pi2 = new PaymentPlanItem()
            {
                Amount       = 12,
                Comment      = "PI2",
                Date         = DateTime.Now,
                DateFrom     = DateTime.Now,
                DateTo       = DateTime.Now,
                FromEmployee = 0,
                ToEmployee   = 0,
                Id           = 1005022,
                Number       = 102,
                PaymentTerms = "PT2-000",
                Prefix       = "P2",
                FactPay      = true,
                DogId        = "25"
            };
            var spi1 = new PaymentPlanItem()
            {
                Amount       = 1000,
                Comment      = "spi1",
                Date         = DateTime.Now,
                DateFrom     = DateTime.Now,
                DateTo       = DateTime.Now,
                FromEmployee = 0,
                ToEmployee   = 0,
                Id           = 123,
                Number       = 100,
                PaymentTerms = "PT1-000",
                Prefix       = "P1",
                FactPay      = true,
                DogId        = "25"
            };
            var spi2 = new PaymentPlanItem()
            {
                Amount       = 1000,
                Comment      = "spi2",
                Date         = DateTime.Now,
                DateFrom     = DateTime.Now,
                DateTo       = DateTime.Now,
                FromEmployee = 0,
                ToEmployee   = 0,
                Id           = 124,
                Number       = 102,
                PaymentTerms = "PT2-000",
                Prefix       = "P2",
                FactPay      = false,
                DogId        = "25"
            };

            c.PaymentPlan = new List <PaymentPlanItem>()
            {
                pi1, pi2, spi1, spi2
            };
            //sc1.PaymentPlan = new List<PaymentPlanItem>() { spi1, spi2 };
            list.Add(c);

            var result = uploadContract.UploadContract(list);

            Assert.IsNull(result);
        }