method/generate.js

/**
 * @module method/generate
 */

const functions = require('firebase-functions');
const admin = require('firebase-admin');

const {has, round} = require('lodash');
const {parse, format} = require('date-fns');
const mustache = require('mustache');

const contractTemplate = require('../template');

/**
 * Generate the contract for a loan
 *
 * @requires template
 *
 * @param  {borrower} borrower - Borrower-related data from Loandisk.
 * @param  {loan} loan - Loan-related data from Loandisk.
 * @param  {loanSchedules} loanSchedules - Original loan schedule of the loan
 * with only repayment and maturity.
 * @param  {boolean} isSigned - Statue of whether the contract generated is signed.
 *
 * @return {string} HTML sting of the full contract
 */
const generate = (borrower, loan, loanSchedules, isSigned) => {
  // Default isSigned to false
  isSigned = isSigned === true;

  // Assign data for html generation
  const data = {
    borrowerFirstName: borrower.borrower_firstname,
    borrowerLastName: borrower.borrower_lastname,
    borrowerUniqueNumber: borrower.borrower_unique_number,
    borrowerAddress: borrower.borrower_address,
    loanNo: loan.loan_application_id,
    loanReleaseDate: loan.loan_released_date,
    principalAmount: loan.loan_principal_amount,
    principalAmountInText: loan.custom_field_2416,
    loanInterest: Number(loan.loan_interest),
    apr: loan.custom_field_1757,
    collateralCollectedAmount: loan.custom_field_2864,
    isSigned: isSigned,
    signedOn: {
      full: format(new Date(), 'PPPPpppp'),
      date: format(new Date(), 'dd/MM/yyyy'),
    },
  };

  // Add data that needs calculation back to data object
  data['totalInterest'] = round(
    Number(loan.loan_principal_amount)
        * (data.loanInterest / 100)
        * Number(loan.loan_duration),
    2
  );
  data['totalAmount'] = data.totalInterest + Number(loan.loan_principal_amount);
  data['loanSchedules'] = loanSchedules.map((schedule) => {
    return {
      date: format(parse(schedule['Date'], 'dd/MM/yyyy', new Date()), 'PP'),
      amount: schedule['Due'],
    }
  })

  // HTML string after inserting data
  return mustache.render(contractTemplate, data);
};

module.exports = generate;