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); }
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}."); }