admin/controllers/third_party/payment/northcapital/index.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 FormData = require('form-data')
const fs = require('fs')
const {
    createIssuer,
    createOffering,
    updateOffering,
    getDocumentsforOffering,
    addDocumentsforOffering,
    deleteDocumentsforOffering,
    updateDocumentforOffering,
    getSubscriptionsforOffering,
    addSubscriptionsforOffering,
    deleteSubscriptionsforOffering,
    updateSubscriptionsforOffering,
} = require('../../../../../front/controllers/payment/northcapital/common')

const northCapitalModule = require('../../../../modules/third_party/payment/northcapital').default
const schemaModule = require('./schema').default
const commonFunction = require('../../../../../common/function').default

const { jsonResponse, errorResponse } = require('../../../logger')

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

const userTableAction = async (req) => {
    req.body.id = commonFunction.getValidID(req.body.id)

    const baseTableUsed = global.configColumns.users
    const customTableUsed = global.configColumns.custom_users

    const [results] = await Promise.all([
        commonFunction.tableFunction(req, baseTableUsed, customTableUsed),
    ])
    return results
}

module.exports = {
    /**
     * Get All Users
     *
     * @memberOf adminside.user
     * @param {adminUserModule.fetchBuyersAll} modules
     */
    allbuyers: async (req, res) => {
        req.body.action = typeof req.body.action === 'undefined' ? 'open' : req.body.action
        let records = []
        let totalRecords = []
        try {
            ;[records, totalRecords] = await Promise.all([
                northCapitalModule.fetchBuyersAll(req, 1),
                northCapitalModule.fetchBuyersAll(req, 0),
            ])
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        } finally {
            let responseData = { records, totalRecords }
            responseData = await commonFunction.getdynamicinnercontents(req, responseData)
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Details successfully retrieved!',
                responseData,
            })
        }
    },
    /**
     * getSingleActionUser
     *
     * @memberOf adminside.user
     * @param {commonFunction.getValidID} modules
     * @param {commonFunction.fetchTableFunction} modules
     */
    getSingleActionUser: async (req, res) => {
        let record = {}
        try {
            const id = typeof req.body.id === 'undefined' ? '' : req.body.id
            req.body.id = commonFunction.getValidID(req.body.id)
            const baseTableUsed = global.configColumns.users
            const customTableUsed = global.configColumns.custom_users

            const [records] = await Promise.all([
                commonFunction.fetchTableFunction(req, baseTableUsed, customTableUsed),
            ])
            record = records[0]
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        } finally {
            const responseData = { record }
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Details successfully retrieved!',
                responseData,
            })
        }
    },
    /**
     * createIssuer
     *
     * @memberOf adminside.user
     * @param {createIssuer} modules
     */
    createIssuer: async (req, res) => {
        try {
            const [responseDataCreateIssuer] = await Promise.all([createIssuer(req)])
            if (responseDataCreateIssuer.status === 'success') {
                jsonResponse(res, responseDataCreateIssuer.status, {
                    responseType: responseDataCreateIssuer.responseType,
                    message: responseDataCreateIssuer.message,
                    responseData: responseDataCreateIssuer.responseData,
                })
            } else {
                jsonResponse(res, responseDataCreateIssuer.status, {
                    responseType: responseDataCreateIssuer.responseType,
                    message: responseDataCreateIssuer.message,
                    responseData: responseDataCreateIssuer.responseData,
                })
            }
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
    /**
     * createOffering
     *
     * @memberOf adminside.third_party.payment.northcapital
     * @param {northCapitalModule.getOfferingNorthDetails} modules
     * @param {commonFunction.getValidID} modules
     * @param {commonFunction.tableFunction} modules
     */
    createOffering: async (req, res) => {
        try {
            const [userNorthDetails] = await Promise.all([
                northCapitalModule.getOfferingNorthDetails(req.body.project_id),
            ])
            req.body.issuerId = NorthCapital.issuerId
            const baseTableUsed = global.configColumns.third_payment_north_offering
            const customTableUsed = { enabled: 0 }

            const queryResponse = {
                body: {
                    issuerId: req.body.issuerId,
                    project_id: req.body.project_id,
                },
            }

            if (userNorthDetails.length > 0) {
                queryResponse.body.id = commonFunction.getValidID(userNorthDetails[0].id)
                req.body.offeringId = userNorthDetails[0].offeringId
                const [responseDataUpdateOffering] = await Promise.all([updateOffering(req)])

                if (responseDataUpdateOffering.status === 'success') {
                    queryResponse.body.offeringId =
                        responseDataUpdateOffering.responseData.offeringDetails[1][0].offeringId
                    queryResponse.body.offeringStatus =
                        responseDataUpdateOffering.responseData.offeringDetails[1][0].offeringStatus

                    await Promise.all([
                        commonFunction.tableFunction(queryResponse, baseTableUsed, customTableUsed),
                    ])
                    jsonResponse(res, responseDataUpdateOffering.status, {
                        responseType: responseDataUpdateOffering.responseType,
                        message: responseDataUpdateOffering.message,
                        responseData: responseDataUpdateOffering.responseData,
                    })
                } else {
                    jsonResponse(res, responseDataUpdateOffering.status, {
                        responseType: responseDataUpdateOffering.responseType,
                        message: responseDataUpdateOffering.message,
                        responseData: responseDataUpdateOffering.responseData,
                    })
                }
            } else {
                const [responseDataCreateOffering] = await Promise.all([createOffering(req)])

                if (responseDataCreateOffering.status === 'success') {
                    queryResponse.body.offeringId =
                        responseDataCreateOffering.responseData.offeringDetails[1][0].offeringId
                    queryResponse.body.offeringStatus =
                        responseDataCreateOffering.responseData.offeringDetails[1][0].offeringStatus
                    await Promise.all([
                        commonFunction.tableFunction(queryResponse, baseTableUsed, customTableUsed),
                    ])
                    jsonResponse(res, responseDataCreateOffering.status, {
                        responseType: responseDataCreateOffering.responseType,
                        message: responseDataCreateOffering.message,
                        responseData: responseDataCreateOffering.responseData,
                    })
                } else {
                    jsonResponse(res, responseDataCreateOffering.status, {
                        responseType: responseDataCreateOffering.responseType,
                        message: responseDataCreateOffering.message,
                        responseData: responseDataCreateOffering.responseData,
                    })
                }
            }
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },

    /**
     * addDocumentsforOffering
     *
     * @memberOf adminside.user
     * @param {northCapitalModule.getOfferingNorthDetails} modules
     * @param {commonFunction.getValidID} modules
     * @param {commonFunction.tableFunction} modules
     */

    addDocumentsforOffering: async (req, res) => {
        try {
            const [userNorthDetails] = await Promise.all([
                northCapitalModule.getOfferingNorthDetails(req.body.project_id),
            ])
            const fileName = req.body.userfile[0]
            if (userNorthDetails.length > 0) {
                const form = new FormData()
                form.append('developerAPIKey', NorthCapital.developerAPIKey)
                form.append('clientID', NorthCapital.clientID)
                form.append('offeringId', userNorthDetails[0].offeringId)
                form.append('file_name', `filename0=${fileName}`)
                form.append('documentTitle', `documentTitle0=${req.body.documentTitle}`)
                form.append(
                    'userfile0',
                    fs.createReadStream(`./public/uploads/${req.body.attachFolder}/${fileName}`),
                    fileName,
                )
                form.append('documentFileReferenceCode', `DOC_${new Date().getTime()}`)

                const [responseDataUploadParty] = await Promise.all([addDocumentsforOffering(form)])

                if (req.user)
                    await Promise.all([
                        commonFunction.eventTriggerFuction(
                            {
                                username: `Admin`,
                                requestername: `${req.user.first_name || ''} ${
                                    req.user.last_name || ''
                                }`,
                                requesterid: req.user.id,
                                requestermail: req.user.email,
                            },
                            global.general.adminemail,
                            '',
                            'northcapital_document_submited',
                            0,
                            0,
                            0,
                        ),
                    ])

                if (responseDataUploadParty.status === 'success') {
                    jsonResponse(res, responseDataUploadParty.status, {
                        responseType: responseDataUploadParty.responseType,
                        message: responseDataUploadParty.message,
                        responseData: responseDataUploadParty.responseData,
                    })
                } else {
                    jsonResponse(res, responseDataUploadParty.status, {
                        responseType: responseDataUploadParty.responseType,
                        message: responseDataUploadParty.message,
                        responseData: responseDataUploadParty.responseData,
                    })
                }
            } else {
                jsonResponse(res, 'error', {
                    responseType: 2,
                    message: 'North Capital details not available!',
                })
            }
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
    /**
     * updateDocumentforOffering
     *
     * @memberOf adminside.third_party.payment.northcapital
     * @param {northCapitalModule.getOfferingNorthDetails} modules
     * @param {updateDocumentforOffering} modules
     * @param {commonFunction.tableFunction} modules
     */
    updateDocumentforOffering: async (req, res) => {
        try {
            const [userNorthDetails] = await Promise.all([
                northCapitalModule.getOfferingNorthDetails(req.body.project_id),
            ])
            if (userNorthDetails.length > 0) {
                const reqDoc = {
                    body: {
                        documentId: req.body.documentId,
                        documentTitle: req.body.documentTitle,
                        documentFileReferenceCode: `DOC_${new Date().getTime()}`,
                    },
                }
                const [responseDataGetDocParty] = await Promise.all([
                    updateDocumentforOffering(reqDoc),
                ])

                if (responseDataGetDocParty.status === 'success') {
                    jsonResponse(res, responseDataGetDocParty.status, {
                        responseType: responseDataGetDocParty.responseType,
                        message: responseDataGetDocParty.message,
                        responseData: responseDataGetDocParty.responseData,
                    })
                } else {
                    jsonResponse(res, responseDataGetDocParty.status, {
                        responseType: responseDataGetDocParty.responseType,
                        message: responseDataGetDocParty.message,
                        responseData: responseDataGetDocParty.responseData,
                    })
                }
            } else {
                jsonResponse(res, 'error', {
                    responseType: 2,
                    message: 'North Capital details not available!',
                })
            }
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
    /**
     * deleteDocumentsforOffering
     *
     * @memberOf adminside.third_party.payment.northcapital
     * @param {northCapitalModule.getOfferingNorthDetails} modules
     * @param {deleteDocumentsforOffering} modules
     */
    deleteDocumentsforOffering: async (req, res) => {
        try {
            const [userNorthDetails] = await Promise.all([
                northCapitalModule.getOfferingNorthDetails(req.body.project_id),
            ])
            if (userNorthDetails.length > 0) {
                const reqDoc = {
                    body: {
                        documentId: req.body.documentId,
                    },
                }
                const [responseDataGetDocParty] = await Promise.all([
                    deleteDocumentsforOffering(reqDoc),
                ])

                if (responseDataGetDocParty.status === 'success') {
                    jsonResponse(res, responseDataGetDocParty.status, {
                        responseType: responseDataGetDocParty.responseType,
                        message: responseDataGetDocParty.message,
                        responseData: responseDataGetDocParty.responseData,
                    })
                } else {
                    jsonResponse(res, responseDataGetDocParty.status, {
                        responseType: responseDataGetDocParty.responseType,
                        message: responseDataGetDocParty.message,
                        responseData: responseDataGetDocParty.responseData,
                    })
                }
            } else {
                jsonResponse(res, 'error', {
                    responseType: 2,
                    message: 'North Capital details not available!',
                })
            }
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
    /**
     * getDocumentsforOffering
     *
     * @memberOf adminside.third_party.payment.northcapital
     * @param {northCapitalModule.getOfferingNorthDetails} modules
     * @param {getDocumentsforOffering} modules
     */
    getDocumentsforOffering: async (req, res) => {
        try {
            const [userNorthDetails] = await Promise.all([
                northCapitalModule.getOfferingNorthDetails(req.body.project_id),
            ])
            if (userNorthDetails.length > 0) {
                const reqDoc = {
                    body: {
                        offeringId: userNorthDetails[0].offeringId,
                    },
                }
                const [responseDataGetDocParty] = await Promise.all([
                    getDocumentsforOffering(reqDoc),
                ])

                if (responseDataGetDocParty.status === 'success') {
                    jsonResponse(res, responseDataGetDocParty.status, {
                        responseType: responseDataGetDocParty.responseType,
                        message: responseDataGetDocParty.message,
                        responseData: responseDataGetDocParty.responseData,
                    })
                } else if (
                    responseDataGetDocParty.responseData.error ===
                    'Party Documents does not exist..'
                ) {
                    jsonResponse(res, 'success', {
                        responseType: 1,
                        message: 'Details successfully retrieved!',
                        responseData: {
                            statusCode: '101',
                            statusDesc: 'Ok',
                            document_details: [],
                        },
                    })
                } else {
                    jsonResponse(res, responseDataGetDocParty.status, {
                        responseType: responseDataGetDocParty.responseType,
                        message: responseDataGetDocParty.message,
                        responseData: responseDataGetDocParty.responseData,
                    })
                }
            } else {
                jsonResponse(res, 'error', {
                    responseType: 2,
                    message: 'North Capital details not available!',
                })
            }
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
    /**
     * addSubscriptionsforOffering
     *
     * @memberOf adminside.third_party.payment.northcapital
     * @param {northCapitalModule.getOfferingNorthDetails} modules
     * @param {addSubscriptionsforOffering} modules
     */
    addSubscriptionsforOffering: async (req, res) => {
        try {
            const [userNorthDetails] = await Promise.all([
                northCapitalModule.getOfferingNorthDetails(req.body.project_id),
            ])
            if (userNorthDetails.length > 0) {
                const reqDoc = {
                    body: {
                        templatename: req.body.templatename,
                        offeringId: userNorthDetails[0].offeringId,
                    },
                }
                const [responseDataGetDocParty] = await Promise.all([
                    addSubscriptionsforOffering(reqDoc),
                ])

                if (responseDataGetDocParty.status === 'success') {
                    jsonResponse(res, responseDataGetDocParty.status, {
                        responseType: responseDataGetDocParty.responseType,
                        message: responseDataGetDocParty.message,
                        responseData: responseDataGetDocParty.responseData,
                    })
                } else {
                    jsonResponse(res, responseDataGetDocParty.status, {
                        responseType: responseDataGetDocParty.responseType,
                        message: responseDataGetDocParty.message,
                        responseData: responseDataGetDocParty.responseData,
                    })
                }
            } else {
                jsonResponse(res, 'error', {
                    responseType: 2,
                    message: 'North Capital details not available!',
                })
            }
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },

    /**
     * addSubscriptionsforOffering
     *
     * @memberOf adminside.third_party.payment.northcapital
     * @param {northCapitalModule.getOfferingNorthDetails} modules
     * @param {updateSubscriptionsforOffering} modules
     */
    updateSubscriptionsforOffering: async (req, res) => {
        try {
            const [userNorthDetails] = await Promise.all([
                northCapitalModule.getOfferingNorthDetails(req.body.project_id),
            ])
            if (userNorthDetails.length > 0) {
                const reqDoc = {
                    body: {
                        templateId: req.body.templateId,
                        templatename: req.body.templatename,
                        offeringId: userNorthDetails[0].offeringId,
                    },
                }
                const [responseDataGetDocParty] = await Promise.all([
                    updateSubscriptionsforOffering(reqDoc),
                ])

                if (responseDataGetDocParty.status === 'success') {
                    jsonResponse(res, responseDataGetDocParty.status, {
                        responseType: responseDataGetDocParty.responseType,
                        message: responseDataGetDocParty.message,
                        responseData: responseDataGetDocParty.responseData,
                    })
                } else {
                    jsonResponse(res, responseDataGetDocParty.status, {
                        responseType: responseDataGetDocParty.responseType,
                        message: responseDataGetDocParty.message,
                        responseData: responseDataGetDocParty.responseData,
                    })
                }
            } else {
                jsonResponse(res, 'error', {
                    responseType: 2,
                    message: 'North Capital details not available!',
                })
            }
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
    /**
     * deleteSubscriptionsforOffering
     *
     * @memberOf adminside.third_party.payment.northcapital
     * @param {northCapitalModule.getOfferingNorthDetails} modules
     * @param {deleteSubscriptionsforOffering} modules
     */
    deleteSubscriptionsforOffering: async (req, res) => {
        try {
            const [userNorthDetails] = await Promise.all([
                northCapitalModule.getOfferingNorthDetails(req.body.project_id),
            ])
            if (userNorthDetails.length > 0) {
                const reqDoc = {
                    body: {
                        templateId: req.body.templateId,
                    },
                }
                const [responseDataGetDocParty] = await Promise.all([
                    deleteSubscriptionsforOffering(reqDoc),
                ])

                if (responseDataGetDocParty.status === 'success') {
                    jsonResponse(res, responseDataGetDocParty.status, {
                        responseType: responseDataGetDocParty.responseType,
                        message: responseDataGetDocParty.message,
                        responseData: responseDataGetDocParty.responseData,
                    })
                } else {
                    jsonResponse(res, responseDataGetDocParty.status, {
                        responseType: responseDataGetDocParty.responseType,
                        message: responseDataGetDocParty.message,
                        responseData: responseDataGetDocParty.responseData,
                    })
                }
            } else {
                jsonResponse(res, 'error', {
                    responseType: 2,
                    message: 'North Capital details not available!',
                })
            }
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
    /**
     * deleteSubscriptionsforOffering
     *
     * @memberOf adminside.third_party.payment.northcapital
     * @param {northCapitalModule.getOfferingNorthDetails} modules
     * @param {getSubscriptionsforOffering} modules
     */
    getSubscriptionsforOffering: async (req, res) => {
        try {
            const [userNorthDetails] = await Promise.all([
                northCapitalModule.getOfferingNorthDetails(req.body.project_id),
            ])
            if (userNorthDetails.length > 0) {
                const reqDoc = {
                    body: {
                        offeringId: userNorthDetails[0].offeringId,
                    },
                }
                const [responseDataGetDocParty] = await Promise.all([
                    getSubscriptionsforOffering(reqDoc),
                ])
                console.log(
                    'responseDataGetDocParty.responseData?.document_details',
                    responseDataGetDocParty,
                )
                if (responseDataGetDocParty.status === 'success') {
                    jsonResponse(res, responseDataGetDocParty.status, {
                        responseType: responseDataGetDocParty.responseType,
                        message: responseDataGetDocParty.message,
                        responseData: responseDataGetDocParty.responseData,
                    })
                } else if (
                    responseDataGetDocParty.responseData?.document_details ===
                    'Template details does not exist.'
                ) {
                    jsonResponse(res, 'success', {
                        responseType: 1,
                        message: 'Details successfully retrieved!',
                        responseData: {
                            statusCode: '101',
                            statusDesc: 'Ok',
                            document_details: [],
                        },
                    })
                } else {
                    jsonResponse(res, 'success', {
                        responseType: 1,
                        message: 'Details successfully retrieved!',
                        responseData: {
                            statusCode: '101',
                            statusDesc: 'Ok',
                            document_details: [],
                        },
                    })
                }
            } else {
                jsonResponse(res, 'error', {
                    responseType: 2,
                    message: 'North Capital details not available!',
                })
            }
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
}