private string GenerateClosedLoansSection(List <Loan> closedLoans)
        {
            bool isFirst            = true;
            var  closedLoansSection = new StringBuilder();

            if (closedLoans.Count > 0)
            {
                closedLoansSection.Append("Loans that were closed last month:<br>");
                foreach (Loan closedLoan in closedLoans)
                {
                    if (!isFirst)
                    {
                        closedLoansSection.Append("<br>");
                    }
                    isFirst = false;
                    var rows = new List <LoanStatusRow>();
                    foreach (LoanTransaction loanTransaction in closedLoan.Transactions.Where(lt => lt.Status == LoanTransactionStatus.Done))
                    {
                        LoanStatusRow currentRow = CreateLoanStatusRowFromTransaction(loanTransaction);
                        if (currentRow != null)
                        {
                            rows.Add(currentRow);
                        }
                    }
                    string tableForLoan = CreateHtmlTableFromClass(rows.OrderBy(p => p.PostDate));
                    closedLoansSection.Append(tableForLoan);
                }
            }
            return(closedLoansSection.ToString());
        }
        private LoanStatusRow CreateLoanStatusRowFromTransaction(LoanTransaction loanTransaction)
        {
            var currentRow = new LoanStatusRow {
                PostDate    = loanTransaction.PostDate,
                Description = loanTransaction.Description,
                Fees        = FormatNumberWithDash(loanTransaction.Fees)
            };

            var pacnetTransaction = loanTransaction as PacnetTransaction;

            if (pacnetTransaction == null)
            {
                var paypointTransaction = loanTransaction as PaypointTransaction;
                if (paypointTransaction == null)
                {
                    return(null);
                }

                currentRow.Type      = "Payment";
                currentRow.Interest  = FormatNumberWithDash(paypointTransaction.Interest);
                currentRow.Principal = FormatNumberWithDash(paypointTransaction.LoanRepayment);
                currentRow.Total     = FormatNumberWithDash(paypointTransaction.LoanRepayment + paypointTransaction.Interest + loanTransaction.Fees);
                currentRow.Status    = paypointTransaction.Status.ToString();
            }
            else
            {
                currentRow.Type      = "Loan";
                currentRow.Interest  = "-";
                currentRow.Principal = "-";
                currentRow.Total     = "-";
                currentRow.Status    = pacnetTransaction.Status.ToString();
            }

            return(currentRow);
        }
        private string GenerateOutstandingLoansSection(List <Loan> outstandingLoans)
        {
            bool isFirst = true;
            var  outstandingLoansSection = new StringBuilder();

            if (outstandingLoans.Count > 0)
            {
                outstandingLoansSection.Append("Loans that are outstanding:<br>");
                foreach (Loan outstandingLoan in outstandingLoans)
                {
                    if (!isFirst)
                    {
                        outstandingLoansSection.Append("<br>");
                    }
                    isFirst = false;
                    var rows = new List <LoanStatusRow>();
                    foreach (
                        LoanTransaction loanTransaction in
                        outstandingLoan.Transactions.Where(lt => lt.Status == LoanTransactionStatus.Done))
                    {
                        LoanStatusRow currentRow = CreateLoanStatusRowFromTransaction(loanTransaction);
                        if (currentRow != null)
                        {
                            rows.Add(currentRow);
                        }
                    }

                    foreach (
                        var loanSchedule in
                        outstandingLoan.Schedule.Where(
                            ls =>
                            ls.Status != LoanScheduleStatus.Paid && ls.Status != LoanScheduleStatus.PaidEarly &&
                            ls.Status != LoanScheduleStatus.PaidOnTime))
                    {
                        rows.Add(new LoanStatusRow {
                            Type        = "Schedule",
                            PostDate    = loanSchedule.Date,
                            Description = string.Empty,
                            Fees        = FormatNumberWithDash(loanSchedule.Fees),
                            Interest    = FormatNumberWithDash(loanSchedule.Interest),
                            Principal   = FormatNumberWithDash(loanSchedule.LoanRepayment),
                            Status      = loanSchedule.Status.ToString(),
                            Total       = FormatNumberWithDash(loanSchedule.LoanRepayment + loanSchedule.Interest + loanSchedule.Fees)
                        });
                    }

                    string tableForLoan = CreateHtmlTableFromClass(rows.OrderBy(p => p.PostDate));
                    outstandingLoansSection.Append(tableForLoan);
                }
            }
            return(outstandingLoansSection.ToString());
        }