/* ============================================================================ *\
|| ########################################################################## ||
|| # 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,
}