Esempio n. 1
0
        public void TestCreditCardInstallmentPlan()
        {
            SimpleLoanCalculationRequest request = new SimpleLoanCalculationRequest();

            request.Amount          = (decimal)100000;
            request.Currency        = "RSD";
            request.StardDate       = new DateTime(2019, 10, 3);
            request.RegularInterest = new List <InterestRateEntry>();
            request.RegularInterest.Add(new InterestRateEntry()
            {
                Date           = request.StardDate,
                RatePercentage = 12,
                IsCompound     = false,
                CalendarBasis  = CalendarBasisKind.Calendar30E360,
                RateUnitOfTime = SimpleUnitOfTime.Y,
                Name           = "Kamata"
            });
            request.InstallmentSchedule            = new SimpleSchedule();
            request.InstallmentSchedule.DayOfMonth = 0;
            request.MinimumDaysForFirstInstallment = 0;
            request.NumberOfInstallments           = 1;
            request.RepaymentType = RepaymentType.Bullet;
            request.InstallmentSchedule.FrequencyPeriod     = 1;
            request.InstallmentSchedule.FrequencyUnitOfTime = SimpleUnitOfTime.Y;
            //request.IntercalarInterestRepaymentType = IntercalarInterestRepaymentType.WithFirstInstallment;

            request.InterestSchedule                     = new SimpleSchedule();
            request.InterestSchedule.DayOfMonth          = 31;
            request.InterestSchedule.FrequencyPeriod     = 1;
            request.InterestSchedule.FrequencyUnitOfTime = SimpleUnitOfTime.M;
            request.ForceInterestWithInstallment         = true;

            request.Fees = new List <FeeEntry>();
            // Ne znam detalje pojedinacnih troskova, pa sam spojio u jedan fiksni iznos koji se vidi na amortplanu
            request.Fees.Add(new FeeEntry()
            {
                FixedAmount          = (decimal)500,
                Currency             = "RSD",
                Date                 = request.StardDate,
                Kind                 = FeeConditionKind.OriginationFee,
                Frequency            = FeeConditionFrequency.EventTriggered,
                CalculationBasisType = CalculationBasisType.ContractAmount,
                Name                 = "Naknada za obradu kreditnog zahteva, Kreditni biro, Menice"
            });

            var result       = InstallmentPlanCalculation.CalculateInstallmentPlan(request);
            var someInr      = result.Rows.Where(it => it.Date == new DateTime(2020, 3, 31)).First().InterestRepayment;
            var sumRepayment = result.Rows.Sum(it => it.PrincipalRepayment);

            Assert.True(sumRepayment == request.Amount);
            Assert.True(result.Rows.Count == 14);
            //Assert.True(Math.Round(result.APR, 2) == (decimal)18.39);
            Assert.True(Math.Round(result.Annuity, 2) == (decimal)100000);
            Assert.True(result.Rows[1].PrincipalRepayment == (decimal)0);
            Assert.True(result.Rows[1].InterestRepayment == (decimal)900);
            Assert.True(result.Rows[2].InterestRepayment == (decimal)1000);
            Assert.True(result.Rows.Last().PrincipalRepayment == (decimal)100000);
            Assert.True(Math.Round(someInr, 2) == (decimal)1033.33);
        }
Esempio n. 2
0
        public void TestSimpleInstallmentPlanCalculationCase4()
        {
            SimpleLoanCalculationRequest request = new SimpleLoanCalculationRequest();

            request.Amount          = (decimal)95500;
            request.Currency        = "RSD";
            request.StardDate       = new DateTime(2019, 10, 3);
            request.RegularInterest = new List <InterestRateEntry>();
            request.RegularInterest.Add(new InterestRateEntry()
            {
                Date           = request.StardDate,
                RatePercentage = 15.950,
                IsCompound     = false,
                CalendarBasis  = CalendarBasisKind.Calendar30E360,
                RateUnitOfTime = SimpleUnitOfTime.Y,
                Name           = "Kamata"
            });

            request.InstallmentSchedule            = new SimpleSchedule();
            request.InstallmentSchedule.DayOfMonth = 5;
            request.MinimumDaysForFirstInstallment = 20;
            request.NumberOfInstallments           = 60;
            request.RepaymentType = RepaymentType.FixedAnnuity;
            request.InstallmentSchedule.FrequencyPeriod     = 1;
            request.InstallmentSchedule.FrequencyUnitOfTime = SimpleUnitOfTime.M;
            request.IntercalarInterestRepaymentType         = IntercalarInterestRepaymentType.WithFirstInstallment;

            request.Fees = new List <FeeEntry>();
            // Ne znam detalje pojedinacnih troskova, pa sam spojio u jedan fiksni iznos koji se vidi na amortplanu
            request.Fees.Add(new FeeEntry()
            {
                FixedAmount          = (decimal)2158.25,
                Currency             = "RSD",
                Date                 = request.StardDate,
                Kind                 = FeeConditionKind.OriginationFee,
                Frequency            = FeeConditionFrequency.EventTriggered,
                CalculationBasisType = CalculationBasisType.ContractAmount,
                Name                 = "Naknada za obradu kreditnog zahteva, Kreditni biro, Menice"
            });

            request.AdjustFirstInstallment = true; // strange logic, but ok...

            var result       = InstallmentPlanCalculation.CalculateInstallmentPlan(request);
            var someInr      = result.Rows.Where(it => it.Date == new DateTime(2020, 3, 5)).First().InterestRepayment;
            var sumRepayment = result.Rows.Sum(it => it.PrincipalRepayment);

            Assert.True(sumRepayment == request.Amount);
            Assert.True(result.Rows.Count == 61);
            Assert.True(Math.Round(result.APR, 2) == (decimal)18.39);
            Assert.True(Math.Round(result.Annuity, 2) == (decimal)2319.84);
            Assert.True(result.Rows[1].PrincipalRepayment == (decimal)1050.49);
            // Imamo razliku u zaokruzivanju
            // Assert.True(result.Rows[1].InterestRepayment == (decimal)1353.98);
            Assert.True(result.Rows[1].InterestRepayment == (decimal)1353.97);
            Assert.True(result.Rows.Last().PrincipalRepayment == (decimal)2289.23);
            Assert.True(Math.Round(someInr, 2) == (decimal)1212.38);
        }
Esempio n. 3
0
        public void TestSimpleInstallmentPlanCalculationCase2()
        {
            SimpleLoanCalculationRequest request = new SimpleLoanCalculationRequest();

            request.Amount          = (decimal)4060.92;
            request.Currency        = "EUR";
            request.StardDate       = new DateTime(2019, 10, 30);
            request.RegularInterest = new List <InterestRateEntry>();
            request.RegularInterest.Add(new InterestRateEntry()
            {
                Date           = request.StardDate,
                RatePercentage = 3.990,
                IsCompound     = false,
                CalendarBasis  = CalendarBasisKind.Calendar30E360,
                RateUnitOfTime = SimpleUnitOfTime.Y,
                Name           = "Kamata"
            });
            request.InstallmentSchedule            = new SimpleSchedule();
            request.InstallmentSchedule.DayOfMonth = 20;
            request.MinimumDaysForFirstInstallment = 20;
            request.NumberOfInstallments           = 36;
            request.RepaymentType = RepaymentType.FixedAnnuity;
            request.InstallmentSchedule.FrequencyPeriod     = 1;
            request.InstallmentSchedule.FrequencyUnitOfTime = SimpleUnitOfTime.M;
            request.IntercalarInterestRepaymentType         = IntercalarInterestRepaymentType.WithFirstInstallment;

            request.Fees = new List <FeeEntry>();
            request.Fees.Add(new FeeEntry()
            {
                Percentage           = (decimal)1.5,
                Date                 = request.StardDate,
                Kind                 = FeeConditionKind.OriginationFee,
                Frequency            = FeeConditionFrequency.EventTriggered,
                CalculationBasisType = CalculationBasisType.ContractAmount,
                Name                 = "Naknada za obradu kreditnog zahteva"
            });

            request.AdjustFirstInstallment = true; // strange logic, but ok...

            var result       = InstallmentPlanCalculation.CalculateInstallmentPlan(request);
            var someInr      = result.Rows.Where(it => it.Date == new DateTime(2020, 3, 20)).First().InterestRepayment;
            var sumRepayment = result.Rows.Sum(it => it.PrincipalRepayment);

            Assert.True(sumRepayment == request.Amount);
            Assert.True(result.Rows.Count == 37);
            Assert.True(Math.Round(result.APR, 2) == (decimal)5.13);
            Assert.True(Math.Round(result.Annuity, 2) == (decimal)119.88);
            Assert.True(result.Rows[1].PrincipalRepayment == (decimal)106.38);
            Assert.True(result.Rows[1].InterestRepayment == (decimal)9.00);
            Assert.True(result.Rows.Last().PrincipalRepayment == (decimal)119.32);
            Assert.True(Math.Round(someInr, 2) == (decimal)12.08);
        }
Esempio n. 4
0
        public void TestSimpleInstallmentPlanCalculationCase1b()
        {
            SimpleLoanCalculationRequest request = new SimpleLoanCalculationRequest();

            //request.Amount = (decimal)16741.12;
            request.Annuity           = (decimal)228.75;
            request.CalculationTarget = CalculationTarget.Amount;
            request.Currency          = "EUR";
            request.StardDate         = new DateTime(2019, 10, 24);
            request.RegularInterest   = new List <InterestRateEntry>();
            request.RegularInterest.Add(new InterestRateEntry()
            {
                Date           = request.StardDate,
                RatePercentage = 3.990,
                IsCompound     = false,
                CalendarBasis  = CalendarBasisKind.Calendar30E360,
                RateUnitOfTime = SimpleUnitOfTime.Y,
                Name           = "Kamata"
            });
            request.InstallmentSchedule            = new SimpleSchedule();
            request.InstallmentSchedule.DayOfMonth = 5;
            request.MinimumDaysForFirstInstallment = 20;
            request.NumberOfInstallments           = 84;
            request.RepaymentType = RepaymentType.FixedAnnuity;
            request.InstallmentSchedule.FrequencyPeriod     = 1;
            request.InstallmentSchedule.FrequencyUnitOfTime = SimpleUnitOfTime.M;
            request.IntercalarInterestRepaymentType         = IntercalarInterestRepaymentType.WithFirstInstallment;

            request.Fees = new List <FeeEntry>();
            request.Fees.Add(new FeeEntry()
            {
                Percentage           = (decimal)1.5,
                Date                 = request.StardDate,
                Kind                 = FeeConditionKind.OriginationFee,
                Frequency            = FeeConditionFrequency.EventTriggered,
                CalculationBasisType = CalculationBasisType.ContractAmount,
                Name                 = "Naknada za obradu kreditnog zahteva"
            });

            request.Fees.Add(new FeeEntry()
            {
                FixedAmount          = (decimal)2.47,
                Currency             = "EUR",
                Date                 = new DateTime(2019, 12, 5),
                Kind                 = FeeConditionKind.Expense,
                Frequency            = FeeConditionFrequency.Monthly,
                CalculationBasisType = CalculationBasisType.PrecalculatedAmount,
                Name                 = "Trosak otvaranja i vodjenja racuna"
            });

            request.Fees.Add(new FeeEntry()
            {
                FixedAmount          = (decimal)(673.01 - 2.47),
                Currency             = "EUR",
                Date                 = new DateTime(2019, 12, 5),
                Kind                 = FeeConditionKind.Expense,
                Frequency            = FeeConditionFrequency.Yearly,
                CalculationBasisType = CalculationBasisType.PrecalculatedAmount,
                Name                 = "Osiguranje nepokretnosti"
            });

            request.AdjustFirstInstallment = true; // strange logic, but ok...

            var result       = InstallmentPlanCalculation.CalculateInstallmentPlan(request);
            var someInr      = result.Rows.Where(it => it.Date == new DateTime(2020, 3, 5)).First().InterestRepayment;
            var sumRepayment = result.Rows.Sum(it => it.PrincipalRepayment);

            Assert.True(sumRepayment == request.Amount);
            Assert.True(result.Rows.Count == 85);
            Assert.True(result.Rows.Last().PrincipalRepayment == (decimal)227.96);
            Assert.True(Math.Round(result.APR, 2) == (decimal)12.47);
            Assert.True(Math.Round(result.Amount, 2) == (decimal)16740.82);
            Assert.True(Math.Round(someInr, 2) == (decimal)53.93);
        }
Esempio n. 5
0
        public void TestSimpleInstallmentPlanCalculationCase29th()
        {
            SimpleLoanCalculationRequest request = new SimpleLoanCalculationRequest();

            request.Amount = (decimal)200000.00;
            //request.Annuity = (decimal)228.75;
            request.CalculationTarget = CalculationTarget.Annuity;
            request.Currency          = "RSD";
            request.StardDate         = new DateTime(2020, 1, 29);
            request.RegularInterest   = new List <InterestRateEntry>();
            request.RegularInterest.Add(new InterestRateEntry()
            {
                Date           = request.StardDate,
                RatePercentage = 7.95,
                IsCompound     = false,
                CalendarBasis  = CalendarBasisKind.Calendar30E360,
                RateUnitOfTime = SimpleUnitOfTime.Y,
                Name           = "Kamata"
            });
            request.InstallmentSchedule            = new SimpleSchedule();
            request.InstallmentSchedule.DayOfMonth = 5;
            request.MinimumDaysForFirstInstallment = 20;
            request.NumberOfInstallments           = 36;
            request.RepaymentType = RepaymentType.FixedAnnuity;
            request.InstallmentSchedule.FrequencyPeriod     = 1;
            request.InstallmentSchedule.FrequencyUnitOfTime = SimpleUnitOfTime.M;
            request.IntercalarInterestRepaymentType         = IntercalarInterestRepaymentType.WithFirstInstallment;

            request.Fees = new List <FeeEntry>();
            request.Fees.Add(new FeeEntry()
            {
                Percentage           = (decimal)2,
                Date                 = request.StardDate,
                Kind                 = FeeConditionKind.OriginationFee,
                Frequency            = FeeConditionFrequency.EventTriggered,
                CalculationBasisType = CalculationBasisType.ContractAmount,
                Name                 = "Naknada za obradu kreditnog zahteva"
            });


            request.Fees.Add(new FeeEntry()
            {
                FixedAmount          = (decimal)245.00,
                Currency             = "RSD",
                Date                 = new DateTime(2020, 1, 29),
                Kind                 = FeeConditionKind.Expense,
                Frequency            = FeeConditionFrequency.EventTriggered,
                CalculationBasisType = CalculationBasisType.PrecalculatedAmount,
                Name                 = "Trošak KB"
            });

            request.AdjustFirstInstallment = true; // strange logic, but ok...
            request.InterestSchedule       = null;
            var result       = InstallmentPlanCalculation.CalculateInstallmentPlan(request);
            var someInr      = result.Rows.Where(it => it.Date == new DateTime(2020, 3, 5)).First().InterestRepayment;
            var sumRepayment = result.Rows.Sum(it => it.PrincipalRepayment);

            Assert.True(sumRepayment == request.Amount);
            Assert.True(result.Rows.Count == 37);
            Assert.True(result.Rows.Last().PrincipalRepayment == (decimal)6221.49);
            Assert.True(Math.Round(result.APR, 2) == (decimal)9.82);
            Assert.True(Math.Round(result.Annuity, 2) == (decimal)6262.66);
            Assert.True(Math.Round(someInr, 2) == (decimal)1590.00);
        }