private static Loan CreateLoan(Loantypes loanType, int tenure, double interestRate, int principal, DateTime payoutDate, IDayCounter dayCalculator)
        {
            Loan loan;

            switch (loanType)
            {
            case Loantypes.FixedEmiLoan:
                loan = new FixedEmiLoan(dayCalculator);
                break;

            case Loantypes.FixedAmortizationLoan:
                loan = new FixedAmortizationLoan(dayCalculator);
                break;

            case Loantypes.FixedInterestLoan:
                loan = new FixedInterestLoan(dayCalculator);
                break;

            default: throw new ArgumentException("Loan type not implemented");
            }
            ;
            loan.TenureYears      = tenure;
            loan.InterestRate     = interestRate;
            loan.StartAmount      = principal;
            loan.CurrentPrincipal = principal;
            loan.PayoutDate       = payoutDate;

            return(loan);
        }
Beispiel #2
0
        static void TestCreatingInvoices(IDayCounter dayCalculator, string filename)
        {
            var loan = new FixedEmiLoan(dayCalculator)
            {
                InterestRate     = 10,
                CurrentPrincipal = 10000,
                StartAmount      = 10000,
                PayoutDate       = new DateTime(2017, 10, 01),
                TenureYears      = 10,
            };

            var invoices = new List <Invoice>();
            var baseDate = loan.PayoutDate;

            while (loan.CurrentPrincipal > 0.001)
            {
                baseDate = baseDate.AddMonths(1);
                var date    = baseDate.AddDays(-1);
                var invoice = loan.AddInvoice(date, new DateTime(date.Year, date.Month, 1), baseDate, 0.0);
                loan.CurrentPrincipal -= invoice.Principal;
                invoices.Add(invoice);

                //Console.WriteLine(invoice.ToString());
                //Console.WriteLine($"{invoice.InvoiceDate.ToString("MMM-yyyy")} | {Math.Round(invoice.FullInvoiceAmount, 0, MidpointRounding.AwayFromZero)} | {Math.Round(invoice.Interest, 0, MidpointRounding.AwayFromZero)} | {Math.Round(invoice.Principal, 0, MidpointRounding.AwayFromZero)} | {Math.Round(loan.CurrentPrincipal, 0, MidpointRounding.AwayFromZero)}");
            }
            Console.WriteLine($"SUM: Principal {invoices.Sum(s => s.Principal)}, Interest: {invoices.Sum(s => s.Interest)}, InvoiceFee: {invoices.Sum(s => s.InvoiceFee)}, LateFee: {invoices.Sum(s => s.LateFee)}");
            TestOutput.CreateCSV(invoices, filename);
        }
Beispiel #3
0
        static void TestPayingOnLoan(IDayCounter dayCalculator)
        {
            var loan = new FixedEmiLoan(dayCalculator)
            {
                InterestRate     = 10,
                CurrentPrincipal = 10000,
                StartAmount      = 10000,
                PayoutDate       = new DateTime(2017, 01, 01),
                TenureYears      = 10,
            };

            var invoices = new List <Invoice>();
            var baseDate = loan.PayoutDate;

            for (int i = 0; i < 3; i++)
            {
                baseDate = baseDate.AddMonths(1);
                var date    = baseDate.AddDays(-1);
                var invoice = loan.AddInvoice(date, new DateTime(date.Year, date.Month, 1), baseDate, 0.0);
                //loan.CurrentPrincipal -= invoice.Principal;
                invoices.Add(invoice);

                //Console.WriteLine(invoice.ToString());
                //Console.WriteLine($"{invoice.InvoiceDate.ToString("MMM-yyyy")} | {Math.Round(invoice.FullInvoiceAmount, 0, MidpointRounding.AwayFromZero)} | {Math.Round(invoice.Interest, 0, MidpointRounding.AwayFromZero)} | {Math.Round(invoice.Principal, 0, MidpointRounding.AwayFromZero)} | {Math.Round(loan.CurrentPrincipal, 0, MidpointRounding.AwayFromZero)}");
            }

            loan.Invoices = invoices;
            var payment = loan.Pay(new DateTime(2017, 03, 31), 5000.0);

            Console.WriteLine(payment.ToString());

            Console.WriteLine($"SUM: Principal {invoices.Sum(s => s.Principal)}, Interest: {invoices.Sum(s => s.Interest)}, InvoiceFee: {invoices.Sum(s => s.InvoiceFee)}, LateFee: {invoices.Sum(s => s.LateFee)}");
            Console.WriteLine("Current Principal: " + loan.CurrentPrincipal);
        }
        public void AddInvoiceTest()
        {
            var dayCalculator = new Thirty360Isda();
            var loan          = new FixedEmiLoan(dayCalculator)
            {
                InterestRate     = 10,
                CurrentPrincipal = 10000,
                StartAmount      = 10000,
                PayoutDate       = new DateTime(2017, 10, 01),
                TenureYears      = 10,
            };

            Invoice invoice  = new Invoice();
            var     invoices = new List <Invoice>();
            var     baseDate = loan.PayoutDate;

            while (loan.CurrentPrincipal >= 0.01)
            {
                baseDate = baseDate.AddMonths(1);
                var date = baseDate.AddDays(-1);
                invoice = loan.AddInvoice(date, new DateTime(date.Year, date.Month, 1), baseDate, 0.0);
                loan.CurrentPrincipal -= invoice.Principal; // Fake payments on the loan.
                invoices.Add(invoice);
            }

            // Assert that the sum is correct.
            var sumPrincipal = invoices.Sum(s => s.Principal);

            Assert.IsTrue(Math.Abs(sumPrincipal - 10000) <= 0.01d, $"Principal: Expected less than 0.01, found {sumPrincipal}");
            var sumInterest = invoices.Sum(s => s.Interest);

            Assert.IsTrue(Math.Abs(invoices.Sum(s => s.Interest) - 5858.1799999999994) <= 0.01d, $"Interest: Expected 5858.179, found {sumInterest}");

            Assert.IsTrue(Math.Abs(invoice.Principal - 0.18d) < 0.01d, $"Last invoice principal: Expected 0.180, found {invoice.Principal}.");
            Assert.IsTrue(Math.Abs(invoice.Interest - 0.00d) < 0.01d, $"Last invoice Interest: Expected 0.000, found {invoice.Interest}.");
        }