front/controllers/payment/northcapital/common.js

/* ============================================================================ *\
|| ########################################################################## ||
|| # Auction Software Marketplace          Release: 0.6   Build 0.7         # ||
|| # ---------------------------------------------------------------------- # ||
|| # License # 35YAHCNR9344X6O666C123AB                                     # ||
|| # ---------------------------------------------------------------------- # ||
|| # Copyright ©2014–2021 Develop Scripts LLC. All Rights Reserved          # ||
|| # This file may not be redistributed in whole or significant part.       # ||
|| # ------------- AUCTION SOFTWARE IS NOT FREE SOFTWARE ------------------ # ||
|| # http://www.auctionsoftwaremarketplace.com|support@auctionsoftware.com  # ||
|| # ---------------------------------------------------------------------- # ||
|| ########################################################################## ||
\* ============================================================================ */

/* eslint-disable prefer-destructuring */
/* eslint-disable no-param-reassign */

const axios = require('axios')
const FormData = require('form-data')
const fs = require('fs')
const cartCommonCtrl = require('../../cart/common')
const buynowCommonCtrl = require('../../buynow/common')

const commonFunction = require('../../../../common/function').default

const northcapitalPaymentModule = require('../../../modules/payment/northcapital').default
const userController = require('../../user')

let NorthCapital = {
    enabled: 0,
}
if (require('config').has('NorthCapital')) {
    NorthCapital = require('config').get('NorthCapital')
}

const schemaModule = require('./schema').default
const { jsonResponse } = require('../../logger')
/**
 *pay cart offline
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} method
 *  matches method with response
 */
const responseMessageFunction = (method) => {
    let responseMessage = 'Details successfully retrieved!'

    if (method === 'createParty') {
        responseMessage = 'Party created successfully'
    } else if (method === 'createEntity') {
        responseMessage = 'Entity created successfully'
    } else if (method === 'createAccount') {
        responseMessage = 'Account created successfully'
    } else if (method === 'createLink') {
        responseMessage = 'User created successfully'
    } else if (method === 'requestCustodialAccount') {
        responseMessage = 'Custodial requested successfully'
    } else if (method === 'getuploadPartyDocument') {
        responseMessage = 'Documents retrieved successfully'
    } else if (method === 'uploadPartyDocument') {
        responseMessage = 'Document uploaded successfully'
    } else if (method === 'performKycAmlBasic') {
        responseMessage = 'KYC check performed successfully'
    } else if (method === 'performAml') {
        responseMessage = 'AMLL check performed successfully'
    } else if (method === 'calculateSuitability') {
        responseMessage = 'Suitability submitted successfully'
    } else if (method === 'updateParty') {
        responseMessage = 'Details updated successfully'
    } else if (method === 'createIssuer') {
        responseMessage = 'Issuer created successfully'
    } else if (method === 'createOffering') {
        responseMessage = 'Offering created successfully'
    } else if (method === 'updateOffering') {
        responseMessage = 'Offering updated successfully'
    } else if (method === 'getDocumentsforOffering') {
        responseMessage = 'Document retrieved successfully'
    } else if (method === 'addDocumentsforOffering') {
        responseMessage = 'Documents added successfully'
    } else if (method === 'deleteDocumentsforOffering') {
        responseMessage = 'Documents deleted successfully'
    } else if (method === 'updateDocumentforOffering') {
        responseMessage = 'Documents updated successfully'
    } else if (method === 'getSubscriptionsforOffering') {
        responseMessage = 'Document retrieved successfully'
    } else if (method === 'addSubscriptionsforOffering') {
        responseMessage = 'Documents added successfully'
    } else if (method === 'deleteSubscriptionsforOffering') {
        responseMessage = 'Documents deleted successfully'
    } else if (method === 'updateSubscriptionsforOffering') {
        responseMessage = 'Documents updated successfully'
    } else if (method === 'linkExternalAccount') {
        responseMessage = 'Bank added successfully'
    } else if (method === 'getExternalAccount') {
        responseMessage = 'Bank retreieved successfully'
    } else if (method === 'deleteExternalAccount') {
        responseMessage = 'Bank deleted successfully'
    } else if (method === 'getCreditCard') {
        responseMessage = 'Card retreieved successfully'
    } else if (method === 'addCreditCard') {
        responseMessage = 'Card added successfully'
    } else if (method === 'updateCreditCard') {
        responseMessage = 'Card updated successfully'
    } else if (method === 'deleteCreditCard') {
        responseMessage = 'Card deleted successfully'
    } else if (method === 'getExternalBank') {
        responseMessage = 'Bank Detail retreieved successfully'
    } else if (method === 'addExternalBank') {
        responseMessage = 'Bank Detail added successfully'
    } else if (method === 'updateExternalBank') {
        responseMessage = 'Bank Detail updated successfully'
    } else if (method === 'deleteExternalBank') {
        responseMessage = 'Bank Detail deleted successfully'
    } else if (method === 'createTrade') {
        responseMessage = 'Trade created successfully'
    } else if (method === 'externalFundMove') {
        responseMessage = 'Bank payment successful'
    } else if (method === 'ccFundMove') {
        responseMessage = 'Card payment successful'
    } else if (method === 'sendSubscriptionDocument') {
        responseMessage = 'Subscription document sent successfully'
    }
    return responseMessage
}
/**
 *apiCall
 *
 * @memberOf frontend.payment.northcapital
 * @param {string} method method (post, get, etc..)
 * @param {string} url requsturl
 * @param {object} data request data
 * @param {object} headertype header type
 * @param {string} baseurl base url
 *  matches method with response
 */
const apiCall = async (method, url, data, headertype, baseurl) => {
    let responseData = {}
    let siteUrl = `${NorthCapital.url}/`
    if (baseurl) {
        siteUrl = `${NorthCapital.url}/${baseurl}/`
    }

    let type = ''
    let headers = {}

    if (headertype && headertype === 'formdata') {
        type = 'multipart/form-data'
        headers = {
            ...headers,
            ...data.getHeaders(),
        }
    } else {
        type = 'application/json'
        data = {
            ...data,
            developerAPIKey: NorthCapital.developerAPIKey,
            clientID: NorthCapital.clientID,
        }
    }

    headers = {
        ...headers,
        'Content-Type': type,
    }

    const options = {
        method,
        headers,
        data,
        url: `${siteUrl}${url}`,
    }

    const [log] = await Promise.all([northcapitalPaymentModule.insertLog(data, options, url)])

    const responseUpdate = {
        id: log.insertId,
    }
    try {
        const axiosResponse = await axios(options)
        responseUpdate.response = axiosResponse.data
        if (axiosResponse.data.statusCode === '101') {
            responseUpdate.status = 'success'
            responseData = {
                status: 'success',
                responseType: 1,
                message: responseMessageFunction(url),
                responseData: axiosResponse.data,
            }
        } else {
            responseUpdate.status = 'error'
            responseData = {
                status: 'error',
                responseType: 4,
                message: 'North Capital Error.',
                responseData: { error: axiosResponse.data.statusDesc },
            }
        }
    } catch (err) {
        responseUpdate.response = err.response.data
        responseUpdate.status = 'error'
        responseData = {
            status: 'error',
            responseType: 4,
            message: 'North Capital Error.',
            responseData: { error: err.response.data.statusDesc },
        }
    }
    northcapitalPaymentModule.updateLog(responseUpdate)
    return responseData
}
/**
 *createParty
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */
const createParty = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([apiCall('put', 'createParty', formData, '', '')])
    return responseData
}
/**
 *createEntity
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */
const createEntity = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([apiCall('put', 'createEntity', formData, '', '')])
    return responseData
}
/**
 *createAccount
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */
const createAccount = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([apiCall('put', 'createAccount', formData, '', '')])
    return responseData
}
/**
 *updateAccount
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */
const updateAccount = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([apiCall('put', 'updateAccount', formData, '', '')])
    return responseData
}
/**
 *createLink
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */
const createLink = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([apiCall('put', 'createLink', formData, '', '')])
    return responseData
}
/**
 *requestCustodialAccounts
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @param {object} reqData reqData object
 * @returns {object} responseData
 */
const requestCustodialAccount = async (req, reqData) => {
    reqData.body.createdIpAddress = req.headers.ipaddress
    const formData = reqData.body
    const [responseData] = await Promise.all([
        apiCall('post', 'requestCustodialAccount', formData, '', ''),
    ])
    return responseData
}
/**
 *requestCustodialAccount
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */
const getuploadPartyDocument = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([
        apiCall('post', 'getuploadPartyDocument', formData, '', ''),
    ])
    return responseData
}
/**
 *uploadPartyDocument
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} formData request object
 * @returns {object} responseData
 */
const uploadPartyDocument = async (formData) => {
    const [responseData] = await Promise.all([
        apiCall('post', 'uploadPartyDocument', formData, 'formdata', ''),
    ])
    return responseData
}
/**
 *performKycAmlBasic
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */
const performKycAmlBasic = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([
        apiCall('post', 'performKycAmlBasic', formData, '', ''),
    ])
    return responseData
}
/**
 *performAml
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */
const performAml = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([apiCall('post', 'performAml', formData, '', '')])
    return responseData
}
/**
 *calculateSuitability
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */
const calculateSuitability = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([
        apiCall('put', 'calculateSuitability', formData, '', ''),
    ])
    return responseData
}
/**
 *updateParty
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */
const updateParty = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([apiCall('post', 'updateParty', formData, '', '')])
    return responseData
}

/**
 *createIssuer
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */

const createIssuer = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([apiCall('put', 'createIssuer', formData, '', '')])
    return responseData
}

/**
 *createOffering
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */

const createOffering = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([apiCall('put', 'createOffering', formData, '', '')])
    return responseData
}

/**
 *updateOffering
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */
const updateOffering = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([apiCall('post', 'updateOffering', formData, '', '')])
    return responseData
}

/**
 *getDocumentsforOffering
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */
const getDocumentsforOffering = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([
        apiCall('post', 'getDocumentsforOffering', formData, '', ''),
    ])
    return responseData
}

/**
 *addDocumentsforOffering
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */

const addDocumentsforOffering = async (formData) => {
    const [responseData] = await Promise.all([
        apiCall('post', 'addDocumentsforOffering', formData, 'formdata', ''),
    ])
    return responseData
}

/**
 *deleteDocumentsforOffering
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */

const deleteDocumentsforOffering = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([
        apiCall('post', 'deleteDocumentsforOffering', formData, '', ''),
    ])
    return responseData
}

/**
 *updateDocumentforOffering
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */

const updateDocumentforOffering = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([
        apiCall('post', 'updateDocumentforOffering', formData, '', ''),
    ])
    return responseData
}

/**
 *getSubscriptionsforOffering
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */

const getSubscriptionsforOffering = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([
        apiCall('post', 'getSubscriptionsforOffering', formData, '', ''),
    ])
    return responseData
}

/**
 *addSubscriptionsforOffering
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */

const addSubscriptionsforOffering = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([
        apiCall('post', 'addSubscriptionsforOffering', formData, '', ''),
    ])
    return responseData
}

/**
 *deleteSubscriptionsforOffering
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */

const deleteSubscriptionsforOffering = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([
        apiCall('post', 'deleteSubscriptionsforOffering', formData, '', ''),
    ])
    return responseData
}

/**
 *updateSubscriptionsforOffering
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */

const updateSubscriptionsforOffering = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([
        apiCall('post', 'updateSubscriptionsforOffering', formData, '', ''),
    ])
    return responseData
}

/**
 *linkExternalAccount
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */

const linkExternalAccount = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([
        apiCall('post', 'linkExternalAccount', formData, '', ''),
    ])
    return responseData
}

/**
 *updateLinkExternalAccount
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */
const updateLinkExternalAccount = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([
        apiCall('post', 'updateLinkExternalAccount', formData, '', ''),
    ])
    return responseData
}

/**
 *getExternalAccount
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */
const getExternalAccount = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([
        apiCall('post', 'getExternalAccount', formData, '', ''),
    ])
    return responseData
}

/**
 *deleteExternalAccount
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */

const deleteExternalAccount = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([
        apiCall('post', 'deleteExternalAccount', formData, '', ''),
    ])
    return responseData
}

/**
 *getCreditCard
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */

const getCreditCard = async (req) => {
    const formData = req.body
    const [responseData] = await Promise.all([apiCall('post', 'getCreditCard', formData, '', '')])
    return responseData
}

/**
 *addCreditCard
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */

const addCreditCard = async (req) => {
    req.body.createdIpAddress = req.headers.ipaddress
    const formData = req.body
    console.log('formData', formData)
    const [responseData] = await Promise.all([apiCall('post', 'addCreditCard', formData, '', '')])
    return responseData
}

/**
 *updateCreditCard
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */

const updateCreditCard = async (req) => {
    req.body.updatedIpAddress = req.headers.ipaddress
    const formData = req.body
    const [responseData] = await Promise.all([
        apiCall('post', 'updateCreditCard', formData, '', ''),
    ])
    return responseData
}

/**
 *deleteCreditCard
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */

const deleteCreditCard = async (req) => {
    req.body.updatedIpAddress = req.headers.ipaddress
    const formData = req.body
    const [responseData] = await Promise.all([
        apiCall('post', 'deleteCreditCard', formData, '', ''),
    ])
    return responseData
}

/**
 *createTrade
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */

const createTrade = async (req, reqDoc) => {
    reqDoc.body.createdIpAddress = req.headers.ipaddress
    const formData = reqDoc.body
    const [responseData] = await Promise.all([apiCall('post', 'createTrade', formData, '', '')])
    return responseData
}

/**
 * External Bank add, edit, update and delete
 * @method {*} getCreditCard
 * @method {*} addCreditCard
 * @method {*} updateCreditCard
 * @method {*} deleteCreditCard
 */

const addExternalBank = async (req) => {
    req.body.createdIpAddress = req.headers.ipaddress
    const formData = req.body
    console.log('formData', formData)
    const [responseData] = await Promise.all([
        apiCall('post', 'createExternalAccount', formData, '', ''),
    ])
    return responseData
}

/**
 *updateExternalBank
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */

const updateExternalBank = async (req) => {
    req.body.updatedIpAddress = req.headers.ipaddress
    const formData = req.body
    const [responseData] = await Promise.all([
        apiCall('post', 'updateExternalAccount', formData, '', ''),
    ])
    return responseData
}

/**
 *externalFundMove
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */

const externalFundMove = async (req, reqDoc) => {
    reqDoc.body.createdIpAddress = req.headers.ipaddress
    const formData = reqDoc.body
    const [responseData] = await Promise.all([
        apiCall('post', 'externalFundMove', formData, '', ''),
    ])
    return responseData
}

/**
 *ccFundMove
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */
const ccFundMove = async (req, reqDoc) => {
    reqDoc.body.createdIpAddress = req.headers.ipaddress
    const formData = reqDoc.body
    const [responseData] = await Promise.all([apiCall('post', 'ccFundMove', formData, '', '')])
    return responseData
}

/**
 *sendSubscriptionDocument
 *
 * @memberOf frontend.payment.northcapital
 * @param {object} req request object
 * @returns {object} responseData
 */

const sendSubscriptionDocument = async (req, reqDoc) => {
    reqDoc.body.createdIpAddress = req.headers.ipaddress
    const formData = reqDoc.body
    const [responseData] = await Promise.all([
        apiCall('post', 'sendSubscriptionDocument', formData, '', ''),
    ])
    return responseData
}

module.exports = {
    apiCall,
    createParty,
    createEntity,
    createAccount,
    updateAccount,
    createLink,
    requestCustodialAccount,
    getuploadPartyDocument,
    uploadPartyDocument,
    performKycAmlBasic,
    performAml,
    calculateSuitability,
    updateParty,
    createIssuer,
    createOffering,
    updateOffering,
    getDocumentsforOffering,
    addDocumentsforOffering,
    deleteDocumentsforOffering,
    updateDocumentforOffering,
    getSubscriptionsforOffering,
    addSubscriptionsforOffering,
    deleteSubscriptionsforOffering,
    updateSubscriptionsforOffering,
    linkExternalAccount,
    updateLinkExternalAccount,
    getExternalAccount,
    deleteExternalAccount,
    getCreditCard,
    addCreditCard,
    updateCreditCard,
    deleteCreditCard,
    createTrade,
    externalFundMove,
    ccFundMove,
    sendSubscriptionDocument,
    addExternalBank,
    updateExternalBank,
}