DataTplClosingDisclosure.cs
//
// This code is part of Document Solutions for Word demos.
// Copyright (c) MESCIUS inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using System.Globalization;
using GrapeCity.Documents.Word;

namespace DsWordWeb.Demos
{
    // This data template sample prints the closing disclosure page
    // of a loan application. It uses data from the sample database,
    // adding a few calculated values based on the sample data.
    public class DataTplClosingDisclosure
    {
        public GcWordDocument CreateDocx(int _ = 0)
        {
            using var ds = new DataSet();
            // Read the sample's data from DsWordTplDataSet.xml:
            ds.ReadXml(Path.Combine("Resources", "data", "DsWordTplDataSet.xml"));
            var dtClosing = ds.Tables["ClosingDisclosure"];
            var row = dtClosing.Rows[0];

            // Calculate monthly loan payments using a standard formula:
            var monthlyPay = CalcMonthlyPayment(Convert.ToDecimal(row["loanAmnt"]), Convert.ToDecimal(row["loanInt"]), Convert.ToInt32(row["loanTerm"]));
            // Other calculated data:
            var calc = new
            {
                totMon1 = monthlyPay + Convert.ToDecimal(row["insurance"]) + Convert.ToDecimal(row["escrow"]),
                totMon8 = monthlyPay + Convert.ToDecimal(row["escrow"]),
                closingCosts = Convert.ToDecimal(row["loanCosts"]) + Convert.ToDecimal(row["otherCosts"]) - Convert.ToDecimal(row["lenderCredit"]),
            };
            // Combined data for the template:
            var data = new
            {
                // issueDate = row["issueDate"].ToString(),
                issueDate = Convert.ToDateTime(row["issueDate"]).ToString("s"),
                closingDate = Convert.ToDateTime(row["closingDate"]).ToString("s"),
                disDate = Convert.ToDateTime(row["disDate"]).ToString("s"),
                agent = row["agent"].ToString(),
                fileNo = row["fileNo"].ToString(),
                propAddr = row["propAddr"].ToString(),
                salePrice = Convert.ToDecimal(row["salePrice"]),
                borrower = row["borrower"].ToString(),
                seller = row["seller"].ToString(),
                lender = row["lender"].ToString(),
                loanTerm = Convert.ToInt32(row["loanTerm"]),
                purpose = row["purpose"].ToString(),
                product = row["product"].ToString(),
                loanID = row["loanID"].ToString(),
                micNum = row["micNum"].ToString(),
                loanAmnt = Convert.ToDecimal(row["loanAmnt"]),
                loanInt = Convert.ToDecimal(row["loanInt"]),
                penalty = Convert.ToDecimal(row["penalty"]),
                insurance = Convert.ToDecimal(row["insurance"]),
                escrow = Convert.ToDecimal(row["escrow"]),
                taxes = Convert.ToDecimal(row["taxes"]),

                cash2close = Convert.ToDecimal(row["cash2close"]),
                loanCosts = Convert.ToDecimal(row["loanCosts"]),
                otherCosts = Convert.ToDecimal(row["otherCosts"]),
                lenderCredit = Convert.ToDecimal(row["lenderCredit"]),

                monthlyPay,
                calc.totMon1,
                calc.totMon8,
                calc.closingCosts,
            };

            // Load the template DOCX, add the data source and process the template:
            var doc = new GcWordDocument();
            doc.Load(Path.Combine("Resources", "WordDocs", "Closing_Disclosure_Template.docx"));
            doc.DataTemplate.DataSources.Add("ds", data);
            doc.DataTemplate.Process(CultureInfo.GetCultureInfo("en-US"));

            // Done:
            return doc;
        }

        // We use this formula to calculate loan payments for the sample:
        // https://cdn.vertex42.com/ExcelArticles/Images/amortization-calculation-formula.png
        private static decimal CalcMonthlyPayment(decimal principal, decimal yearlyInterest, int years)
        {
            var r = (double)(yearlyInterest / 12);
            var n = 12 * years;
            var q = Math.Pow(1 + r, n);
            var a = (double)principal * ((r * q) / (q - 1));
            return (decimal)a;
        }

        public static List<string[]> GetSampleParamsList()
        {
            return new List<string[]>()
            {
                new string[] { "@data-templates/Closing Disclosure", "Generate the closing disclosure page of a loan application", null },
                new string[] { "@use-data-tpl/Closing Disclosure", "Generate the closing disclosure page of a loan application", null },
            };
        }
    }
}