front/controllers/payment/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 axios = require('axios')
const dateFormat = require('dateformat')

const paymentModule = require('../../modules/payment').default
const buynowModule = require('../../modules/buynow').default
const commonFunction = require('../../../common/function').default
const northCapitalCtrl = require('./northcapital')
const cartCommonCtrl = require('../cart/common')
const buyNowCommonCtrl = require('../buynow/common')
const appointmentCtrl = require('../appointment')
const creditCtrl = require('../credit')
const rosoomPaymentModule = require('../../modules/payment/rosoom').default

const shippingArtaCtrl = require('../shipping/arta/common')
const shippingShipEngineCtrl = require('../shipping/shipengine/common')

const schemaModule = require('./schema').default
const { jsonResponse } = require('../logger')
const kountCtrl = require('../kount')

/**
 * short Describe sch
 *
 * @memberOf frontend.payment
 * @param {object} items list of items
 */
const shortDescribeSCH = async (items) => {
    function changingdata(item) {
        const payItems = {
            itemId: item.item_id,
            name: item.title.substring(0, 31),
            description: item.desc_proc,
            quantity: item.qty,
            unitPrice: item.buynowamount,
            taxable: 'true',
        }
        return payItems
    }
    const promises = items.map(changingdata)
    items = await Promise.all(promises)
    return items
}
/**
 * short Describe sch
 *
 * @memberOf frontend.payment
 * @param {object} items list of items
 * @param {paymentModule.insertPayLogRequest} module
 */
const generateRequestData = async (type, cardDetails, lineItem, cartValues, refTransId) => {
    const request = {}
    request.createTransactionRequest = {}
    request.createTransactionRequest.merchantAuthentication = {
        name: global.authorize.api_login_id,
        transactionKey: global.authorize.transaction_key,
    }
    const results = await Promise.all([
        paymentModule.insertPayLogRequest(cartValues.id, cartValues.user_id, type, 'authorize'),
    ])
    request.createTransactionRequest.refId = results[0].insertId
    request.createTransactionRequest.transactionRequest = {}
    if (type === 'priorAuthCaptureTransaction') {
        request.createTransactionRequest.transactionRequest.transactionType = type
        request.createTransactionRequest.transactionRequest.amount = cardDetails.card_amount
        request.createTransactionRequest.transactionRequest.refTransId = refTransId
    } else {
        request.createTransactionRequest.transactionRequest.transactionType = type
        request.createTransactionRequest.transactionRequest.amount = cardDetails.card_amount
        request.createTransactionRequest.transactionRequest.payment = {
            creditCard: {
                cardNumber: cardDetails.card_number,
                expirationDate: cardDetails.card_expiry,
                cardCode: cardDetails.card_cvv,
            },
        }

        request.createTransactionRequest.transactionRequest.lineItems = {
            lineItem,
        }
        request.createTransactionRequest.transactionRequest.tax = {
            amount: cartValues.total_tax,
            name: 'Sales Tax',
        }
        request.createTransactionRequest.transactionRequest.customer = {
            id: cartValues.user_id,
        }
        request.createTransactionRequest.transactionRequest.billTo = {
            firstName: cartValues.bill_first_name,
            lastName: cartValues.bill_first_name,
            address: cartValues.bill_address1,
            city: cartValues.bill_city,
            state: cartValues.bill_state,
            zip: cartValues.bill_zipcode,
            country: 'USA',
        }
        request.createTransactionRequest.transactionRequest.customerIP = '192.168.1.1'

        request.createTransactionRequest.transactionRequest.userFields = {
            userField: [
                {
                    name: 'refId',
                    value: results[0].insertId,
                },
            ],
        }
    }

    return request
}
/**
 * makeApiCall
 *
 * @memberOf frontend.payment
 * @param {object} data requst data
 * @param {paymentModule.updatePayLogRequest} module
 */
const makeApiCall = async (data) => {
    let responseData = {}
    const url = global.authorize.endpoint
    const options = {
        method: 'POST',
        headers: { 'content-type': 'application/json' },
        data,
        url,
    }
    // paymentModule.updatePayLogRequest(
    //     { request: JSON.stringify(data) },
    //     data.createTransactionRequest.refId,
    //     1,
    // )
    const response = await axios(options)
    const paymentResponse = response.data.transactionResponse
    if (paymentResponse) {
        paymentModule.updatePayLogRequest(
            { response: JSON.stringify(paymentResponse), transactionID: paymentResponse.transId },
            paymentResponse.userFields[0].value,
            0,
        )
    }

    if (
        paymentResponse &&
        (parseInt(paymentResponse.responseCode, 10) === 1 ||
            parseInt(paymentResponse.responseCode, 10) === 4)
    ) {
        responseData = {
            status: 'success',
            responseType: 1,
            message: 'Payment succesfully completed!',
            responseData: { paymentResponse },
        }
    } else if (paymentResponse && paymentResponse.errors) {
        responseData = {
            status: 'error',
            responseType: 2,
            message: paymentResponse.errors[0].errorText,
        }
    } else if (response.data.messages.message.length) {
        responseData = {
            status: 'error',
            responseType: 3,
            message: response.data.messages.message[0].text,
        }
    } else {
        responseData = {
            status: 'error',
            responseType: 4,
            message: 'Payment Gateway Error.',
        }
    }
    return responseData
}
/**
 * Payment Success
 *
 * @memberOf frontend.payment
 * @param {number} cartID cart id
 * @param {number} userID user id
 * @param {paymentModule.getMinimumInvoiceID} module
 * @param {paymentModule.getCartDetails} module
 * @param {paymentModule.markCartPaid} module
 * @param {paymentModule.markBuyNowPaid} module
 * @param {paymentModule.addAppointment} module
 * @param {paymentModule.updateBuynowAppointment} module
 */
const paymentSuccess = async (cartID, userID, req) => {
    const [results, cartDetails] = await Promise.all([
        paymentModule.getMinimumInvoiceID(cartID),
        paymentModule.getCartDetails(cartID),
    ])
    if (req.body.payment_method === 'card') {
        await Promise.all([
            paymentModule.markCartPaid(req.body.payment_method, cartID, 1),
            paymentModule.markBuyNowPaid(cartID, results[0].common_invoice, 1),
        ])
    } else if (req.body.payment_method === 'curbside') {
        await Promise.all([
            paymentModule.markCartPaid(req.body.payment_method, cartID, 0),
            paymentModule.markBuyNowPaid(cartID, results[0].common_invoice, 0),
        ])
    }
    let apnmtIDUpdate = req.body.appointmentID
    if (!apnmtIDUpdate) {
        const resultsAppoint = await Promise.all([
            paymentModule.addAppointment(req.body.pickup, userID, cartDetails[0].cartlocation_id),
        ])
        apnmtIDUpdate = resultsAppoint[0].insertId
    }
    await Promise.all([paymentModule.updateBuynowAppointment(cartID, apnmtIDUpdate)])
    const responseData = {}
    return responseData
}
/**
 * Payment Success
 *
 * @memberOf frontend.payment
 * @param {object} items items object
 * @param {shippingArtaCtrl.confirmShipping} module
 */
const shippingSuccess = async (items) => {
    try {
        const responseData = {}
        const configCal = global.calculations.shipping
        const type = configCal.value
        if (configCal.value_from === 'third_party') {
            if (configCal.value_variable === 'table') {
                if (configCal.value === 'shipping') {
                    const shippingType = items[type] || items.projects_shipping
                    if (shippingType === 'arta') {
                        await shippingArtaCtrl.confirmShipping({
                            item: items,
                        })
                    } else if (shippingType === 'shipEngine') {
                        await shippingShipEngineCtrl.confirmShipping({
                            item: items,
                        })
                    }
                }
            }
        }
        return responseData
    } catch (e) {
        console.log('Error', e)
    }
}
/**
 * Payment Success
 *
 * @memberOf frontend.payment
 * @param {object} items items object
 * @param {shippingArtaCtrl.getTracking} module
 * @param {shippingShipEngineCtrl.getTracking} module
 * @param {commonFunction.userDetails} module
 * @param {commonFunction.eventTriggerFuction} module
 */
const sendTrackingNumber = async (items, userID) => {
    try {
        const responseDataReturn = {}
        let responseData = null
        let shippingType = null
        const configCal = global.calculations.shipping
        const type = configCal.value
        if (configCal.value_from === 'third_party') {
            if (configCal.value_variable === 'table') {
                if (configCal.value === 'shipping') {
                    shippingType = items[type] || items.projects_shipping
                    if (shippingType === 'arta') {
                        responseData = await shippingArtaCtrl.getTracking({
                            item: items,
                        })
                    } else if (shippingType === 'shipEngine') {
                        responseData = await shippingShipEngineCtrl.getTracking({
                            item: items,
                        })
                    }
                }
            }
        }
        if (responseData) {
            const [results] = await Promise.all([commonFunction.userDetails(userID)])
            if (results.length) {
                const [userValue] = results
                let trackingUrl = null
                let trackingNumber = null
                if (shippingType === 'arta') {
                    trackingNumber = responseData.responseData.id
                    trackingUrl = responseData.responseData.url
                } else if (shippingType === 'shipEngine') {
                    trackingNumber = responseData.responseData.tracking_number
                    trackingUrl = responseData.responseData.tracking_url
                }
                await Promise.all([
                    commonFunction.eventTriggerFuction(
                        {
                            ...items,
                            ...userValue,
                            ...responseData.responseData,
                            trackingUrl,
                            trackingNumber,
                        },
                        userValue.email,
                        userValue.phone,
                        'tracking_notification',
                        0,
                        1,
                        userValue.id,
                    ),
                ])
            }
        }
        return responseDataReturn
    } catch (e) {
        console.log('Error', e)
    }
}
/**
 * Payment Success
 *
 * @memberOf frontend.payment
 * @param {object} items items object
 * @param {appointmentCtrl.appointmentCheck} module
 * @param {cartCommonCtrl.getSingleCartDetails} module
 * @param {buynowModule.getCommonInvoiceNo} module
 * @param {buynowModule.buynowinvoiceUpdate} module
 * @param {commonFunction.notifyinsertCron} module
 */
const paymentSuccessAfter = async (cartID, userID, req) => {
    let invoiceID = 0
    const appointmentID = await appointmentCtrl.appointmentCheck(cartID, req.body.user_id, req)
    req.body.amount = req.body.amount ? req.body.amount : 0
    req.body.invoice_id = req.body.invoice_id ? req.body.invoice_id : 0
    if (cartID.pay_type === 'buynow') {
        req.body.cart_id = cartID.cart_id.toString()
        let responseData = []
        let invoiceNumber = []
        if (req.body.invoice_id > 0) {
            ;[responseData, invoiceNumber] = await Promise.all([
                cartCommonCtrl.getSingleCartDetails(req, null, req.body.cart_id),
                buynowModule.getCommonInvoiceNo(
                    'common_invoice',
                    global.configColumns.buynow.ext_name,
                ),
            ])
        } else {
            ;[responseData, invoiceNumber] = await Promise.all([
                buyNowCommonCtrl.getSingleCartDetails(req, null, req.body.cart_id),
                buynowModule.getCommonInvoiceNo(
                    'common_invoice',
                    global.configColumns.buynow.ext_name,
                ),
            ])
        }

        const productData = responseData.cartItems
        const productValue = responseData.cartValues
        const invoiceData = invoiceNumber
        let cinvoiceno = 10000
        if (productValue.common_invoice && productValue.common_invoice > 0) {
            cinvoiceno = productValue.common_invoice
        } else if (invoiceData.length > 0) {
            cinvoiceno =
                invoiceData[0].common_invoice === 0 || invoiceData[0].common_invoice === ''
                    ? 10000
                    : parseInt(invoiceData[0].common_invoice, 10) + 1
        }

        if (productData.length) {
            if (productValue.common_invoice && productValue.common_invoice > 0) {
                productValue.total_paid = productValue.total_paid ? productValue.total_paid : 0
                req.body.delivery_type = productData[0].delivery_type.toString()
                req.body.common_invoice = cinvoiceno
                req.body.payment_method = req.body.response.payment_method.toString()
                req.body.total_invoice = parseFloat(productValue.total_amount).toFixed(2)
                if (req.body.payment_method === 'offline') {
                    req.body.total_due_amount = parseFloat(productValue.total_paid).toFixed(2)
                } else {
                    req.body.total_due_amount = (
                        parseFloat(req.body.response.serviceCost) +
                        parseFloat(productValue.total_paid)
                    ).toFixed(2)
                }

                req.body.date_added = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
                req.body.appointment_id = parseInt(appointmentID, 10)
                if (
                    (parseFloat(req.body.response.serviceCost) ===
                        parseFloat(productValue.total_due_amount) &&
                        parseFloat(productValue.total_due_amount) > 0 &&
                        req.body.payment_method !== 'offline') ||
                    parseFloat(req.body.amount) === parseFloat(productValue.total_due_amount)
                ) {
                    req.body.paid = 1
                    req.body.paid_date = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
                    await Promise.all([
                        buynowModule.buynowinvoiceUpdate(req, req.body.cart_id, userID),
                    ])
                    if (typeof global.configFeatures.paid_email !== 'undefined') {
                        if (parseInt(global.configFeatures.paid_email.enabled, 10) === 1) {
                            const wonNotify = {
                                refer_id: cinvoiceno,
                                refer_field: global.configFeatures.paid_email.cat_name,
                                type: 'paid_email',
                            }
                            await Promise.all([commonFunction.notifyinsertCron(wonNotify)])
                        }
                    }
                } else {
                    req.body.paid = 0

                    await Promise.all([
                        buynowModule.buynowinvoicePartialUpdate(req, req.body.cart_id, userID),
                    ])
                }
            } else {
                const resultloop = []
                const baseTableUsed = global.configColumns.buynow
                const customTableUsed = { enabled: 0 }
                req.body.total_invoice = parseFloat(productValue.total_amount).toFixed(2)
                if (
                    req.body.response.payment_method.toString() !== 'offline' &&
                    parseFloat(req.body.response.serviceCost) === parseFloat(req.body.total_invoice)
                ) {
                    if (typeof global.configFeatures.paid_email !== 'undefined') {
                        if (parseInt(global.configFeatures.paid_email.enabled, 10) === 1) {
                            const wonNotify = {
                                refer_id: cinvoiceno,
                                refer_field: global.configFeatures.paid_email.cat_name,
                                type: 'paid_email',
                            }
                            await Promise.all([commonFunction.notifyinsertCron(wonNotify)])
                        }
                    }
                }
                const processAllItemscartspay = async (prdt) => {
                    req.body.project_id = prdt.projects_id
                    req.body.user_id = prdt.user_id
                    req.body.amount = parseFloat(prdt.amount).toFixed(2)
                    req.body.per_total = parseFloat(prdt.per_total).toFixed(2)
                    req.body.qty = prdt.qty
                    req.body.cart_id = prdt.cart_id
                    req.body.delivery_type = prdt.delivery_type.toString()
                    req.body.active = 1
                    req.body.common_invoice = cinvoiceno
                    req.body.buynow_autype = 'buynow'
                    req.body.payment_method = req.body.response.payment_method.toString()
                    req.body.tax_percent = parseFloat(prdt.tax_percent).toFixed(2)
                    req.body.total_tax = parseFloat(prdt.total_tax).toFixed(2)
                    req.body.buyer_premium_percent = parseFloat(prdt.buyer_premium_percent).toFixed(
                        2,
                    )
                    req.body.total_premium = parseFloat(prdt.total_premium).toFixed(2)
                    req.body.shipping_percent = parseFloat(prdt.shipping_percent).toFixed(2)
                    req.body.total_shipping = parseFloat(prdt.total_shipping).toFixed(2)
                    req.body.total_invoice = parseFloat(productValue.total_amount).toFixed(2)
                    req.body.total_amount = prdt.total_amount
                    req.body.date_added = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
                    if (
                        req.body.payment_method !== 'offline' &&
                        parseFloat(req.body.response.serviceCost) ===
                            parseFloat(req.body.total_invoice)
                    ) {
                        req.body.paid_date = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
                        req.body.paid = 1
                        req.body.partial = 0
                    } else {
                        req.body.partial = 1
                    }
                    if (req.body.payment_method === 'offline') {
                        req.body.paid_amount = parseFloat(productValue.total_paid).toFixed(2)
                    } else {
                        req.body.paid_amount = (
                            parseFloat(req.body.response.serviceCost) +
                            parseFloat(productValue.total_paid)
                        ).toFixed(2)
                    }
                    req.body.appointment_id = parseInt(appointmentID, 10)
                    await Promise.all([
                        commonFunction.tableFunction(req, baseTableUsed, customTableUsed),
                        buynowModule.cartqtyproductsoldvalue(prdt.qty, prdt.projects_id),
                        buynowModule.cartqtyproductsub(prdt.qty, prdt.projects_id),
                        buynowModule.cartTableqtyUpdate(
                            prdt.cart_id,
                            prdt.user_id,
                            prdt.projects_id,
                        ),
                    ])
                    const [productDatanew] = await Promise.all([
                        buynowModule.getlotcartsdetails(
                            'id,market_status,sold,booked,qty',
                            [prdt.projects_id.toString()],
                            'id=?',
                            global.configColumns.projects.ext_name,
                            1,
                        ),
                    ])

                    if (productDatanew.length > 0) {
                        if (productDatanew[0].sold >= productDatanew[0].qty) {
                            await Promise.all([
                                buynowModule.removeSoldTempCart(prdt.projects_id),
                                buynowModule.productstatusupdate('sold', prdt.projects_id),
                            ])
                        }
                    }
                    return true
                }

                await commonFunction.asyncForEach(productData, async (carts) => {
                    const looptoformat = await processAllItemscartspay(carts)
                    resultloop.push(looptoformat)
                })
                await Promise.all(resultloop)
            }
        }
        invoiceID = cinvoiceno
    } else if (cartID.pay_type === 'auction' || cartID.pay_type === 'live') {
        req.body.cart_id = cartID.cart_id.toString()
        const [responseData, invoiceNumber] = await Promise.all([
            cartCommonCtrl.getSingleCartDetails(req, null, req.body.cart_id),
            buynowModule.getCommonInvoiceNo('common_invoice', global.configColumns.buynow.ext_name),
        ])
        const productData = responseData.cartItems
        const productValue = responseData.cartValues
        const invoiceData = invoiceNumber
        let cinvoiceno = 10000
        if (productValue.common_invoice && productValue.common_invoice > 0) {
            cinvoiceno = productValue.common_invoice
        } else if (invoiceData.length > 0) {
            cinvoiceno =
                invoiceData[0].common_invoice === 0 || invoiceData[0].common_invoice === ''
                    ? 10000
                    : parseInt(invoiceData[0].common_invoice, 10) + 1
        }

        if (productData.length) {
            productValue.total_paid = productValue.total_paid ? productValue.total_paid : 0
            req.body.delivery_type = productData[0].delivery_type.toString()
            req.body.common_invoice = cinvoiceno
            req.body.payment_method = req.body.response.payment_method.toString()
            req.body.total_invoice = parseFloat(productValue.total_amount).toFixed(2)
            if (req.body.payment_method === 'offline') {
                req.body.total_due_amount = parseFloat(productValue.total_paid).toFixed(2)
            } else {
                req.body.total_due_amount = parseFloat(
                    parseFloat(req.body.response.serviceCost) + parseFloat(productValue.total_paid),
                ).toFixed(2)
            }

            req.body.date_added = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
            req.body.appointment_id = parseInt(appointmentID, 10)
            if (
                (parseFloat(req.body.response.serviceCost) ===
                    parseFloat(productValue.total_due_amount) &&
                    parseFloat(productValue.total_due_amount) > 0 &&
                    req.body.payment_method !== 'offline') ||
                parseFloat(req.body.amount) === parseFloat(productValue.total_due_amount)
            ) {
                req.body.paid = 1
                req.body.paid_date = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
                await Promise.all([buynowModule.buynowinvoiceUpdate(req, req.body.cart_id, userID)])
                if (typeof global.configFeatures.paid_email !== 'undefined') {
                    if (parseInt(global.configFeatures.paid_email.enabled, 10) === 1) {
                        const wonNotify = {
                            refer_id: cinvoiceno,
                            refer_field: global.configFeatures.paid_email.cat_name,
                            type: 'paid_email',
                        }
                        await Promise.all([commonFunction.notifyinsertCron(wonNotify)])
                    }
                }
            } else {
                req.body.paid = 0
                await Promise.all([
                    buynowModule.buynowinvoicePartialUpdate(req, req.body.cart_id, userID),
                ])
            }

            if (
                typeof global.configFeatures.invoice_address !== 'undefined' &&
                global.configFeatures.invoice_address.enabled
            ) {
                // update the user's last address as billing address
                await Promise.all([
                    buynowModule.updateAddress(req.body.cart_id, productData[0].user_id, 'bill'),
                ])
            }
            if (typeof global.calculations.shipping !== 'undefined') {
                if (global.calculations.shipping.enabled) {
                    await shippingSuccess(productData[0])
                    await sendTrackingNumber(productData[0], userID)
                }
            }
        }
        invoiceID = cinvoiceno
    }

    return invoiceID
}
/**
 * security data
 *
 * @memberOf frontend.payment
 * @param {string} message key
 */
const securitydata = async (message) => {
    const crypto = require('crypto')
    const fs = require('fs')
    const jks = require('jks-js')
    const keystore = jks.toPem(fs.readFileSync('public/rdsign/keystoreuat1.jks'), 'dpworlduat1')
    const privateKey = keystore.dpworlduat1.key
    const publicKey = keystore.dpworlduat1.cert

    // const ulrPath = `public/private.key`
    // const ulrPath2 = `public/publickey.cer`
    // const privateKey = fs.readFileSync(ulrPath, 'utf8')
    // const publicKey = fs.readFileSync(ulrPath2, 'utf8')

    const RSASign = async (privateKeyRSA, data) => {
        const sign = crypto.createSign('RSA-SHA1')
        sign.update(data)
        const sig = sign.sign(privateKeyRSA, 'base64')
        return sig
    }

    const RSAVerify = async (publicKeyRSA, signature, data) => {
        const verify = crypto.createVerify('RSA-SHA1')
        verify.update(data)
        const verify34 = verify.verify(publicKeyRSA, signature, 'base64')
        return verify34
    }

    const dataToSign = message
    let sig = RSASign(privateKey, dataToSign)
    sig = await sig
    const verify2 = RSAVerify(publicKey, sig, dataToSign)
    return sig
}
/**
 * Items Amount Calculations
 *
 * @memberOf frontend.payment
 * @param {object} req request object
 * @param {buynowModule.updateAdminFee} method
 * @param {buyNowCommonCtrl.getSingleCartDetails} method
 * @param {cartCommonCtrl.getSingleCartDetails} method
 */
const ItemsAmountCalculations = async (req, type) => {
    const cartRes = {
        payAmount: 0,
        cartID: 0,
        invoiceID: 0,
    }
    req.body.amount = req.body.amount ? req.body.amount : 0

    if (
        typeof global.configFeatures.cart_timer !== 'undefined' &&
        global.configFeatures.cart_timer.enabled === 1
    ) {
        await Promise.all([buynowModule.extendCartTimer(req)])
    }

    if (typeof global.configFeatures.admin_fee !== 'undefined') {
        if (global.configFeatures.admin_fee.enabled) {
            if (req.body.admin_fee || req.body.admin_fee_percent) {
                await Promise.all([buynowModule.updateAdminFee(req)])
            }
        }
    }

    if (type === 'buynow') {
        req.body.invoice_id = req.body.invoice_id ? req.body.invoice_id : 0
        let responseData = []
        if (req.body.invoice_id > 0) {
            ;[responseData] = await Promise.all([
                cartCommonCtrl.getSingleCartDetails(
                    req,
                    req.body.cart_id ? req.body.cart_id : 0,
                    null,
                    req.body.invoice_id ? req.body.invoice_id : 0,
                ),
            ])
        } else {
            ;[responseData] = await Promise.all([
                buyNowCommonCtrl.getSingleCartDetails(req, req.body.cart_id),
            ])
        }
        cartRes.cartItems = responseData.cartItems
        if (req.body.amount > 0) {
            cartRes.payAmount = req.body.amount
        } else {
            cartRes.payAmount = responseData.cartValues.total_due_amount
        }
        cartRes.invoiceID = req.body.invoice_id ? req.body.invoice_id : 0
        cartRes.cartID = responseData.cartValues.cart_id.toString()
    } else if (type === 'auction' || type === 'live') {
        const [responseData] = await Promise.all([
            cartCommonCtrl.getSingleCartDetails(
                req,
                req.body.cart_id ? req.body.cart_id : 0,
                null,
                req.body.invoice_id ? req.body.invoice_id : 0,
            ),
        ])
        cartRes.cartItems = responseData.cartItems
        if (req.body.amount > 0) {
            cartRes.payAmount = req.body.amount
        } else {
            cartRes.payAmount = responseData.cartValues.total_due_amount
        }
        cartRes.invoiceID = req.body.invoice_id ? req.body.invoice_id : 0
        cartRes.cartID = responseData.cartValues.cart_id.toString()
    } else if (type === 'deposit') {
        cartRes.payAmount = req.body.amount ? req.body.amount : 0
        cartRes.cartID = req.body.cart_id ? req.body.cart_id : 0
    } else if (type === 'bid_deposit') {
        if (typeof global.calculations.deposit_amount !== 'undefined') {
            if (global.calculations.deposit_amount.enabled) {
                const paymentObject = {
                    type: 'projects',
                    amount: 0,
                }
                req.body.payment_object = req.body.payment_object ? req.body.payment_object : ''
                if (req.body.payment_object !== '') {
                    const paymentObjectType = req.body.payment_object
                    paymentObject.type = paymentObjectType.type
                    paymentObject.amount = paymentObjectType.amount
                }
                cartRes.cartID = req.body.cart_id ? req.body.cart_id : 0
                req.body.id = commonFunction.getValidID(cartRes.cartID)
                const baseTableUsed = global.configColumns[paymentObject.type]
                const customTableUsed = { enabled: 0 }
                const [records] = await Promise.all([
                    commonFunction.fetchTableFunction(req, baseTableUsed, customTableUsed),
                ])
                const cartCalculation = await buyNowCommonCtrl.checkcalculationFun(
                    'deposit_amount',
                    paymentObject.amount,
                    records[0],
                )
                cartRes.payAmount = cartCalculation.total
            }
        }
    }
    return cartRes
}
/**
 * Items Amount Calculations
 *
 * @memberOf frontend.payment
 * @param {object} req request object
 * @param {object} res request object
 * @param {paymentModule.insertPayLogResponseRosoom} method
 * @param {buynowModule.getlotcartsdetails} method
 * @param {creditCtrl.bidDepositFund} method
 * @param {commonFunction.tableFunction} method
 * @param {commonFunction.commonselectparenttable} method
 * @param {commonFunction.eventTriggerFuction} method
 * @param {buynowModule.updateAdminFee} method
 */
const rosoomPaymentsuccess = async (req, res) => {
    try {
        const payCartID =
            typeof req.body.response.payLogID === 'undefined' ? 0 : req.body.response.payLogID
        if (payCartID > 0) {
            const paylogResults = await Promise.all([
                paymentModule.insertPayLogResponseRosoom(
                    req,
                    payCartID.toString(),
                    JSON.stringify(req.body.response),
                ),
            ])
            if (req.body.response.status === '1') {
                const [payLogData] = await Promise.all([
                    buynowModule.getlotcartsdetails(
                        'cart_id,gateway,pay_type,user_id,payment_object',
                        [payCartID.toString()],
                        ' id=? ',
                        'payment_logs',
                        1,
                    ),
                ])
                if (!payLogData.length) {
                    jsonResponse(res, 'error', {
                        responseType: 3,
                        message: 'Invalid Product Data!',
                    })
                } else if (
                    payLogData[0].gateway === 'rosoom' ||
                    payLogData[0].gateway === 'stripe' ||
                    payLogData[0].gateway === 'northcapital'
                ) {
                    req.body.user_id = payLogData[0].user_id
                    if (payLogData[0].pay_type === 'deposit') {
                        let depositType = ''
                        let depositUserID = 0
                        let depositNotes = ''
                        payLogData[0].payment_object = payLogData[0].payment_object
                            ? payLogData[0].payment_object
                            : ''
                        if (payLogData[0].payment_object !== '') {
                            const PaymentData = {
                                body: JSON.parse(payLogData[0].payment_object),
                            }
                            depositType = PaymentData.body.credit_type
                                ? PaymentData.body.credit_type
                                : ''
                            depositUserID = PaymentData.body.creditor_id
                                ? PaymentData.body.creditor_id
                                : 0
                            depositNotes = PaymentData.body.credit_notes
                                ? PaymentData.body.credit_notes
                                : ''
                        }
                        req.body.amount = parseFloat(req.body.response.serviceCost).toFixed(2)
                        req.body.trans_id = req.body.response.soTransactionID
                        req.body.remove_credit = 0
                        req.body.withdraw = 0
                        req.body.balance_check = 0
                        req.body.creditor_id = depositUserID
                        req.body.credit_type = depositType
                        req.body.credit_notes = depositNotes
                        const updateDeposit = await creditCtrl.depositFund(
                            payLogData[0],
                            req.body.user_id,
                            req,
                        )

                        jsonResponse(res, 'success', {
                            responseType: 1,
                            message: 'Payment completed!',
                            responseData: {
                                pay_type: payLogData[0].pay_type,
                            },
                        })
                    } else if (payLogData[0].pay_type === 'bid_deposit') {
                        let depositType = ''
                        payLogData[0].payment_object = payLogData[0].payment_object
                            ? payLogData[0].payment_object
                            : ''
                        if (payLogData[0].payment_object !== '') {
                            const PaymentData = {
                                body: JSON.parse(payLogData[0].payment_object),
                            }
                            depositType = PaymentData.body.type
                        }
                        req.body.amount = parseFloat(req.body.response.serviceCost).toFixed(2)
                        req.body.trans_id = req.body.response.soTransactionID
                        req.body.type = depositType
                        req.body.type_id = payLogData[0].cart_id
                        req.body.status = 'success'
                        req.body.gateway = payLogData[0].gateway
                        const updateBidDeposit = await creditCtrl.bidDepositFund(
                            payLogData[0],
                            req.body.user_id,
                            req,
                        )
                        if (typeof global.configFeatures.admin_fee !== 'undefined') {
                            if (global.configFeatures.admin_fee.enabled) {
                                const updateAdminfee = await Promise.all([
                                    buynowModule.updateAdminFee(req),
                                ])
                            }
                        }

                        jsonResponse(res, 'success', {
                            responseType: 1,
                            message: 'Payment completed!',
                            responseData: payLogData[0],
                        })
                    } else {
                        payLogData[0].payment_object = payLogData[0].payment_object
                            ? payLogData[0].payment_object
                            : ''
                        if (payLogData[0].payment_object !== '') {
                            const PaymentData = {
                                body: JSON.parse(payLogData[0].payment_object),
                            }
                            req.body.invoice_id = PaymentData.body.invoice_id
                        }
                        const updateInvoice = await paymentSuccessAfter(
                            payLogData[0],
                            req.body.user_id,
                            req,
                        )
                        const baseTableUsed1 = global.configColumns.pay_records
                        const customTableUsed1 = { enabled: 0 }
                        req.body.trans_id = req.body.response.soTransactionID
                        req.body.payment_method = req.body.response.payment_method
                        req.body.payment_type = req.body.response.payment_type
                        req.body.cart_id = updateInvoice.toString()
                        req.body.status = 'success'
                        req.body.no_of_cards = 'single'
                        req.body.mk_card_number = 'XXXX-XXXX-XXX'
                        req.body.card_type = req.body.response.paymentInstrument
                        req.body.amount = parseFloat(req.body.response.serviceCost).toFixed(2)
                        req.body.created_at = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
                        const [resultspay] = await Promise.all([
                            commonFunction.tableFunction(req, baseTableUsed1, customTableUsed1),
                        ])
                        const results3 = await Promise.all([
                            commonFunction.commonselectparenttable(
                                'id,status,first_name,last_name,phone,CONCAT(IFNULL(first_name,"")," ",IFNULL(last_name,"")) AS username,companyname,email,phone',
                                'id',
                                req.body.user_id,
                                global.configColumns.users,
                            ),
                        ])
                        await Promise.all([
                            commonFunction.eventTriggerFuction(
                                {
                                    username: results3[0][0].username,
                                    invoice_id: req.body.cart_id,
                                    amount: req.body.amount,
                                    payment_method: req.body.payment_method,
                                    trans_id: req.body.trans_id,
                                },
                                results3[0][0].email,
                                results3[0][0].phone,
                                'payment_notify',
                                1,
                                9,
                                results3[0][0].id,
                            ),
                        ])

                        if (typeof global.configFeatures.admin_fee !== 'undefined') {
                            if (global.configFeatures.admin_fee.enabled) {
                                const updateAdminfee = await Promise.all([
                                    buynowModule.updateAdminFee(req),
                                ])
                            }
                        }

                        jsonResponse(res, 'success', {
                            responseType: 1,
                            message: 'Payment completed!',
                            responseData: {
                                pay_type: payLogData[0].pay_type,
                            },
                        })
                    }
                } else {
                    jsonResponse(res, 'error', {
                        responseType: 1,
                        message: 'Payment method not defined!',
                    })
                }
            } else {
                jsonResponse(res, 'error', {
                    responseType: 3,
                    message: req.body.response.message,
                })
            }
        } else {
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Invalid Payment ID!',
            })
        }
    } catch (e) {
        console.log('Error', e)
        jsonResponse(res, 'error', {
            responseType: 3,
            message: 'Internal Server error!',
        })
    }
}

module.exports = {
    /**
     * Authorize the payment
     *
     * @memberOf frontend.payment
     * @param {frontend.cart.getSingleCartDetails} modules
     * @param {frontend.payment.paymentSuccess} modules
     * @param {paymentModule.authorizeInsertPayRecord} modules
     */
    paymentSuccessAfter,
    securitydata,
    ItemsAmountCalculations,
    /**
     * Items Amount Calculations
     *
     * @memberOf frontend.payment
     * @param {object} req request object
     * @param {object} res request object
     * @param {kountCtrl.getPaymentValidation} method
     * @param {kountCtrl.getPaymentValidation} method
     * @param {payment.generateRequestData} method
     * @param {payment.makeApiCall} method
     * @param {paymentModule.authorizeInsertPayRecord} method
     */
    authorizePayment: async (req, res) => {
        try {
            // const paymentData = {
            //     card_number: '5424000000000015',
            //     card_expiry: '2020-12',
            //     card_cvv: '999',
            //     card_amount: '10',
            // }
            const [cartDetails] = await Promise.all([
                cartCommonCtrl.getSingleCartDetails(req, req.body.cart_id),
            ])

            if (req.body.payment_method === 'card') {
                cartDetails.cartItems = await shortDescribeSCH(cartDetails.cartItems)
                let detailsFirstCard = {}
                let detailsSecondCard = {}
                detailsFirstCard = {
                    card_number: req.body.card_number,
                    card_expiry: req.body.card_expiry,
                    card_cvv: req.body.card_cvv,
                    card_amount: req.body.card_amount,
                }
                let kountResponse = { status: 'success' }
                let kountResponseSecond = { status: 'success' }
                if (req.body.no_of_cards === 'multiple') {
                    detailsSecondCard = {
                        card_number: req.body.second_card_number,
                        card_expiry: req.body.second_card_expiry,
                        card_cvv: req.body.second_card_cvv,
                        card_amount: req.body.second_card_amount,
                    }
                    ;[kountResponse, kountResponseSecond] = await Promise.all([
                        kountCtrl.getPaymentValidation(req, detailsFirstCard, cartDetails),
                        kountCtrl.getPaymentValidation(req, detailsSecondCard, cartDetails),
                    ])
                } else {
                    ;[kountResponse] = await Promise.all([
                        kountCtrl.getPaymentValidation(req, detailsFirstCard, cartDetails),
                    ])
                }
                console.log('kountResponse Payment', kountResponse, kountResponseSecond)
                if (
                    kountResponse.status === 'success' &&
                    kountResponseSecond.status === 'success'
                ) {
                    const dataFirstCard = await generateRequestData(
                        'authOnlyTransaction',
                        detailsFirstCard,
                        cartDetails.cartItems,
                        cartDetails.cartValues,
                    )

                    const captureDataFirstCard = await generateRequestData(
                        'authCaptureTransaction',
                        detailsFirstCard,
                        cartDetails.cartItems,
                        cartDetails.cartValues,
                    )

                    if (req.body.no_of_cards === 'multiple') {
                        const dataSecondCard = await generateRequestData(
                            'authOnlyTransaction',
                            detailsSecondCard,
                            cartDetails.cartItems,
                            cartDetails.cartValues,
                        )

                        const captureDataSecondCard = await generateRequestData(
                            'authCaptureTransaction',
                            detailsSecondCard,
                            cartDetails.cartItems,
                            cartDetails.cartValues,
                        )

                        const [authResponseFirstCard, authResponseSecondCard] = await Promise.all([
                            makeApiCall(dataFirstCard),
                            makeApiCall(dataSecondCard),
                        ])
                        if (
                            authResponseFirstCard.status === 'success' &&
                            authResponseSecondCard.status === 'success'
                        ) {
                            const [captureResponseFirstCard, captureResponseSecondCard] =
                                await Promise.all([
                                    makeApiCall(captureDataFirstCard),
                                    makeApiCall(captureDataSecondCard),
                                ])
                            if (
                                captureResponseFirstCard.status === 'success' &&
                                captureResponseSecondCard.status === 'success'
                            ) {
                                await Promise.all([
                                    paymentModule.authorizeInsertPayRecord(
                                        req,
                                        detailsFirstCard,
                                        cartDetails.cartValues,
                                        captureResponseFirstCard.responseData.paymentResponse,
                                    ),
                                    paymentModule.authorizeInsertPayRecord(
                                        req,
                                        detailsSecondCard,
                                        cartDetails.cartValues,
                                        captureResponseSecondCard.responseData.paymentResponse,
                                    ),
                                    paymentSuccess(
                                        cartDetails.cartValues.id,
                                        cartDetails.cartValues.user_id,
                                        req,
                                    ),
                                ])
                                jsonResponse(
                                    res,
                                    captureResponseFirstCard.status,
                                    captureResponseFirstCard,
                                )
                            } else if (captureResponseFirstCard.status !== 'success') {
                                jsonResponse(
                                    res,
                                    captureResponseFirstCard.status,
                                    captureResponseFirstCard,
                                )
                            } else {
                                jsonResponse(
                                    res,
                                    captureResponseSecondCard.status,
                                    captureResponseSecondCard,
                                )
                            }
                        } else if (authResponseFirstCard.status !== 'success') {
                            jsonResponse(res, authResponseFirstCard.status, authResponseFirstCard)
                        } else {
                            jsonResponse(res, authResponseSecondCard.status, authResponseSecondCard)
                        }
                    } else {
                        const [authResponseFirstCard] = await Promise.all([
                            makeApiCall(dataFirstCard),
                        ])
                        if (authResponseFirstCard.status === 'success') {
                            const [captureResponseFirstCard] = await Promise.all([
                                makeApiCall(captureDataFirstCard),
                            ])
                            if (captureResponseFirstCard.status === 'success') {
                                await Promise.all([
                                    paymentModule.authorizeInsertPayRecord(
                                        req,
                                        detailsFirstCard,
                                        cartDetails.cartValues,
                                        captureResponseFirstCard.responseData.paymentResponse,
                                    ),
                                    paymentSuccess(
                                        cartDetails.cartValues.id,
                                        cartDetails.cartValues.user_id,
                                        req,
                                    ),
                                ])
                                jsonResponse(
                                    res,
                                    captureResponseFirstCard.status,
                                    captureResponseFirstCard,
                                )
                            } else {
                                jsonResponse(
                                    res,
                                    captureResponseFirstCard.status,
                                    captureResponseFirstCard,
                                )
                            }
                        } else {
                            jsonResponse(res, authResponseFirstCard.status, authResponseFirstCard)
                        }
                    }
                } else if (kountResponse.status === 'success') {
                    jsonResponse(res, 'error', {
                        responseType: kountResponseSecond.responseType,
                        message: kountResponseSecond.message,
                        responseData: kountResponseSecond.responseData,
                    })
                } else {
                    jsonResponse(res, 'error', {
                        responseType: kountResponse.responseType,
                        message: kountResponse.message,
                        responseData: kountResponse.responseData,
                    })
                }
            } else if (req.body.payment_method === 'curbside') {
                await Promise.all([
                    paymentSuccess(cartDetails.cartValues.id, cartDetails.cartValues.user_id, req),
                ])
                jsonResponse(res, 'success', {
                    responseType: 1,
                    message: 'Checkout Successfully completed!',
                })
            }
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 5,
                message: 'Internal Server error!',
            })
        }
    },
    /**
     * rosoom Payment call
     *
     * @memberOf frontend.payment
     * @param {object} req request object
     * @param {object} res request object
     * @param {rosoomPaymentModule.getProjectIDfromCartID} method
     * @param {paymentModule.checkPaymentLog} method
     * @param {rosoomPaymentModule.getCartIDfromProjectID} method
     * @param {rosoomPaymentModule.getRosoomPaymentPending} method
     * @param {paymentModule.checkPaymentLog} method
     */
    rosoomPaymentcall: async (req, res) => {
        try {
            const request = require('request')
            req.body.pay_type = req.body.pay_type ? req.body.pay_type : ''
            if (req.body.pay_type === '') {
                jsonResponse(res, 'success', {
                    responseType: 0,
                    message: 'Invalid Payment Method!',
                })
            } else {
                req.body.user_id = req.user.id
                const uniq = `S${new Date().getTime()}`
                req.body.serviceDescription = 'Product Charges'
                req.body.responseURL = global.RosoomPayment.returnUrl
                req.body.customerReferenceNumber = `Customer${req.body.user_id}`
                req.body.documentationCharges = 0
                req.body.amount = req.body.amount ? req.body.amount : 0
                req.body.popup = 'Yes'
                const totalAmountCheck = await ItemsAmountCalculations(req, req.body.pay_type)
                const totalAmount = totalAmountCheck.payAmount
                const payCartID = totalAmountCheck.cartID
                const payInvoiceID = totalAmountCheck.invoiceID
                let paymentObject = ''
                req.body.payment_object = req.body.payment_object ? req.body.payment_object : ''
                if (req.body.pay_type === 'bid_deposit') {
                    if (req.body.payment_object !== '') {
                        req.body.payment_object.amount = req.body.amount
                        paymentObject = JSON.stringify(req.body.payment_object)
                    }
                } else if (
                    typeof global.configurations.variables.schedule_appointment !== 'undefined'
                ) {
                    if (global.configurations.variables.schedule_appointment) {
                        if (req.body.payment_object !== '') {
                            req.body.payment_object.amount = req.body.amount
                            paymentObject = JSON.stringify(req.body.payment_object)
                        }
                    }
                } else if (req.body.payment_object !== '') {
                    req.body.payment_object.amount = req.body.amount
                    paymentObject = JSON.stringify(req.body.payment_object)
                }

                if (totalAmount === 0) {
                    jsonResponse(res, 'success', {
                        responseType: 0,
                        message: 'Invalid Amount!',
                    })
                } else {
                    let responseData = []
                    if (
                        req.body.pay_type === 'buynow' ||
                        req.body.pay_type === 'auction' ||
                        req.body.pay_type === 'live'
                    ) {
                        if (payCartID) {
                            if (req.body.pay_type === 'buynow') {
                                const [responseCartData] = await Promise.all([
                                    rosoomPaymentModule.getProjectIDfromCartID(payCartID),
                                ])

                                if (responseCartData.length) {
                                    if (payInvoiceID > 0) {
                                        ;[responseData] = await Promise.all([
                                            paymentModule.checkPaymentLog(
                                                payCartID,
                                                req.body.user_id,
                                            ),
                                        ])
                                    } else {
                                        const [responseProjectData] = await Promise.all([
                                            rosoomPaymentModule.getCartIDfromProjectID(
                                                responseCartData[0].project_id,
                                            ),
                                        ])
                                        if (responseProjectData.length) {
                                            const processAllItems = async (items) => {
                                                const [responsePendingPayment] = await Promise.all([
                                                    rosoomPaymentModule.getRosoomPaymentPending(
                                                        items,
                                                    ),
                                                ])
                                                console.log(
                                                    'responsePendingPayment',
                                                    responsePendingPayment,
                                                )
                                                if (responsePendingPayment.length) {
                                                    responsePendingPayment[0].cart_id = items
                                                    responseData.push(responsePendingPayment[0])
                                                }
                                            }

                                            await commonFunction.asyncForEach(
                                                responseProjectData[0].cart_id.split(','),
                                                async (element) => {
                                                    await processAllItems(element)
                                                },
                                            )
                                        }
                                    }
                                }

                                console.log('responseCartData')
                            } else {
                                ;[responseData] = await Promise.all([
                                    paymentModule.checkPaymentLog(payCartID, req.body.user_id),
                                ])
                            }
                        }
                    }

                    if (!responseData.length) {
                        const encryptDataPay = `soTransactionID::${uniq}||serviceID::${global.RosoomPayment.serviceID}||serviceOwnerID::${global.RosoomPayment.serviceOwnerID}||serviceCost::${totalAmount}||documentationCharges::${req.body.documentationCharges}||serviceDescription::${req.body.serviceDescription}||responseURL::${req.body.responseURL}||licenseKey::${global.RosoomPayment.licenseKey}||serviceChannel::${global.RosoomPayment.serviceChannel}||customerReferenceNumber::${req.body.customerReferenceNumber}||buEncryptionMode::${global.RosoomPayment.buEncryptionMode}||`
                        const paylogResults = await Promise.all([
                            paymentModule.insertPayLogRequestRosoom(
                                req,
                                payCartID.toString(),
                                encryptDataPay.toString(),
                                req.body.user_id,
                                uniq,
                                req.body.pay_type,
                                'rosoom',
                                paymentObject,
                            ),
                        ])
                        const payLogID = paylogResults[0].insertId
                        req.body.payment_method = req.body.payment_method
                            ? req.body.payment_method
                            : 'online'
                        req.body.responseURL = `${global.RosoomPayment.returnUrl}?payLogID=${payLogID}&payment_method=${req.body.payment_method}`
                        const encryptData = `soTransactionID::${uniq}||serviceID::${global.RosoomPayment.serviceID}||serviceOwnerID::${global.RosoomPayment.serviceOwnerID}||serviceCost::${totalAmount}||documentationCharges::${req.body.documentationCharges}||serviceDescription::${req.body.serviceDescription}||responseURL::${req.body.responseURL}||licenseKey::${global.RosoomPayment.licenseKey}||serviceChannel::${global.RosoomPayment.serviceChannel}||customerReferenceNumber::${req.body.customerReferenceNumber}||buEncryptionMode::${global.RosoomPayment.buEncryptionMode}||`
                        const payload = {
                            soTransactionID: uniq,
                            serviceID: global.RosoomPayment.serviceID,
                            serviceOwnerID: global.RosoomPayment.serviceOwnerID,
                            serviceCost: totalAmount,
                            documentationCharges: req.body.documentationCharges,
                            serviceDescription: req.body.serviceDescription,
                            responseURL: req.body.responseURL,
                            licenseKey: global.RosoomPayment.licenseKey,
                            serviceChannel: global.RosoomPayment.serviceChannel,
                            customerReferenceNumber: req.body.customerReferenceNumber,
                            buEncryptionMode: global.RosoomPayment.buEncryptionMode,
                            popup: req.body.popup,
                            signature: await securitydata(encryptData),
                        }
                        const urlrosoom = global.RosoomPayment.url
                        const successRes = {}

                        console.log('ROSOOM payload', payload)
                        request.get(
                            {
                                url: urlrosoom,
                                qs: payload,
                            },
                            (err, response, body) => {
                                if (err) {
                                    successRes.result = err
                                    successRes.url = ''
                                } else if (response.statusCode === '200') {
                                    let payurl = response.request.url.href
                                    payurl = payurl.replace('Yes', 'NO')
                                    successRes.result = response.body
                                    successRes.url = payurl
                                } else {
                                    let payurl = response.request.url.href
                                    payurl = payurl.replace('Yes', 'NO')
                                    successRes.result = response.body
                                    successRes.url = payurl
                                }
                                jsonResponse(res, 'success', {
                                    responseType: 1,
                                    message: 'Redirecting to Payment Gateway...',
                                    responseData: successRes,
                                })
                            },
                        )
                    } else {
                        console.log('rosoom_payment existing pending')
                        jsonResponse(res, 'error', {
                            responseType: 3,
                            message:
                                'Transaction for this cart is pending. Please wait for a while and try again later.',
                        })
                    }
                }
            }
        } catch (e) {
            console.log('rosoom_payment', e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
    /**
     * stripe payment call
     *
     * @memberOf frontend.payment
     * @param {object} req request object
     * @param {object} res request object
     * @param {paymentModule.insertPayLogRequestRosoom} method
     */
    stripePaymentcall: async (req, res) => {
        try {
            const request = require('request')
            req.body.pay_type = req.body.pay_type ? req.body.pay_type : ''
            if (req.body.pay_type === '') {
                jsonResponse(res, 'success', {
                    responseType: 0,
                    message: 'Invalid Payment Method!',
                })
            } else {
                req.body.user_id = req.user.id
                req.body.common_invoice = req.body.invoice_id
                const uniq = `S${new Date().getTime()}`
                req.body.serviceDescription = 'Product Charges'
                req.body.responseURL = ''
                req.body.customerReferenceNumber = `Customer${req.body.user_id}`
                req.body.documentationCharges = 0
                req.body.amount = req.body.amount ? req.body.amount : 0
                req.body.popup = 'Yes'
                const totalAmountCheck = await ItemsAmountCalculations(req, req.body.pay_type)
                console.log('totalAmountCheck', totalAmountCheck)
                const totalAmount = totalAmountCheck.payAmount
                const payCartID = totalAmountCheck.cartID
                let paymentObject = ''
                req.body.payment_object = req.body.payment_object ? req.body.payment_object : ''
                if (req.body.pay_type === 'bid_deposit') {
                    if (req.body.payment_object !== '') {
                        req.body.payment_object.amount = req.body.amount
                        paymentObject = JSON.stringify(req.body.payment_object)
                    }
                } else if (
                    typeof global.configurations.variables.schedule_appointment !== 'undefined'
                ) {
                    if (global.configurations.variables.schedule_appointment) {
                        if (req.body.payment_object !== '') {
                            req.body.payment_object.amount = req.body.amount
                            paymentObject = JSON.stringify(req.body.payment_object)
                        }
                    }
                } else if (req.body.payment_object !== '') {
                    req.body.payment_object.amount = req.body.amount
                    paymentObject = JSON.stringify(req.body.payment_object)
                }

                if (totalAmount === 0) {
                    jsonResponse(res, 'success', {
                        responseType: 0,
                        message: 'Invalid Amount!',
                    })
                } else {
                    const payload = req.body.paymentInfo || {}
                    payload.account_id =
                        payload && payload.account_id
                            ? payload.account_id
                            : global.StripePayment.account_id
                    payload.amount = parseInt(totalAmount * 100, 10)
                    payload.currency =
                        payload && payload.currency
                            ? payload.currency
                            : global.StripePayment.default_currency

                    const urlStripe =
                        req.body.payment_type !== 'card'
                            ? `${global.StripePayment.url}/api/charge/bankCreate`
                            : `${global.StripePayment.url}/api/charge/create`
                    const successRes = {}
                    const resData = await axios({
                        method: 'post',
                        url: urlStripe,
                        data: payload,
                    })
                    const finalResult = async (data) => {
                        console.log(data, 'data final')
                        if (data.status === 'error') {
                            successRes.result = 'error'
                            successRes.url = ''
                            jsonResponse(res, 'error', {
                                responseType: 1,
                                message: data.message ? data.message : 'Payment failed!! ',
                                responseData: successRes,
                            })
                            return false
                        }

                        const paylogResults = await Promise.all([
                            paymentModule.insertPayLogRequestRosoom(
                                req,
                                payCartID.toString(),
                                data.data.responseData.id,
                                req.body.user_id,
                                uniq,
                                req.body.pay_type,
                                'stripe',
                                paymentObject,
                            ),
                        ])
                        if (paylogResults[0].insertId) {
                            req.body.response = {}
                            req.body.response.status = '1'
                            req.body.response.payLogID = paylogResults[0].insertId
                            req.body.response.serviceCost = totalAmount
                            req.body.response.payment_method = req.body.payment_method
                            req.body.response.payment_type = req.body.payment_type || ''
                            req.body.response.soTransactionID = data.data.responseData.id
                            req.body.response.paymentInstrument = ''
                            rosoomPaymentsuccess(req, res)
                            return false
                        }
                        successRes.result = `Please contact admin ${global.common.general.adminemail}`
                        successRes.url = ''
                        jsonResponse(res, 'error', {
                            responseType: 1,
                            message: 'Payment failed!! ',
                            responseData: successRes,
                        })
                        return false
                    }
                    finalResult(resData.data)
                }
            }
        } catch (e) {
            console.log('rosoom_payment', e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
    /**
     * stripe payment call
     *
     * @memberOf frontend.payment
     * @param {object} req request object
     * @param {object} res request object
     * @param {northCapitalCtrl.createTrade} method
     * @param {paymentModule.insertPayLogRequestRosoom} method
     */
    northCapitalPaymentcall: async (req, res) => {
        try {
            req.body.pay_type = req.body.pay_type ? req.body.pay_type : ''
            if (req.body.pay_type === '') {
                jsonResponse(res, 'success', {
                    responseType: 0,
                    message: 'Invalid Payment Method!',
                })
            } else {
                req.body.user_id = req.user.id
                const uniq = `S${new Date().getTime()}`
                req.body.serviceDescription = 'Product Charges'
                req.body.responseURL = ''
                req.body.customerReferenceNumber = `Customer${req.body.user_id}`
                req.body.documentationCharges = 0
                req.body.amount = req.body.amount ? req.body.amount : 0
                req.body.popup = 'Yes'
                const totalAmountCheck = await ItemsAmountCalculations(req, req.body.pay_type)
                const totalAmount = totalAmountCheck.payAmount
                const payCartID = totalAmountCheck.cartID
                let paymentObject = ''
                req.body.payment_object = req.body.payment_object ? req.body.payment_object : ''
                if (req.body.pay_type === 'bid_deposit') {
                    if (req.body.payment_object !== '') {
                        req.body.payment_object.amount = req.body.amount
                        paymentObject = JSON.stringify(req.body.payment_object)
                    }
                } else if (
                    typeof global.configurations.variables.schedule_appointment !== 'undefined'
                ) {
                    if (global.configurations.variables.schedule_appointment) {
                        if (req.body.payment_object !== '') {
                            req.body.payment_object.amount = req.body.amount
                            paymentObject = JSON.stringify(req.body.payment_object)
                        }
                    }
                } else if (req.body.payment_object !== '') {
                    req.body.payment_object.amount = req.body.amount
                    paymentObject = JSON.stringify(req.body.payment_object)
                }

                if (totalAmount === 0) {
                    jsonResponse(res, 'success', {
                        responseType: 0,
                        message: 'Invalid Amount!',
                    })
                } else {
                    const payload = req.body.paymentInfo || {}
                    payload.cartItems = totalAmountCheck.cartItems
                    payload.account_id =
                        payload && payload.account_id
                            ? payload.account_id
                            : global.StripePayment.account_id
                    payload.amount = parseInt(totalAmount, 10)
                    payload.currency =
                        payload && payload.currency
                            ? payload.currency
                            : global.StripePayment.default_currency
                    const successRes = {}
                    const resData = await northCapitalCtrl.createTrade(req, payload)

                    const finalResult = async (data) => {
                        if (data.status === 'error') {
                            successRes.result = 'error'
                            successRes.url = ''
                            jsonResponse(res, 'error', {
                                responseType: 1,
                                message: data.message ? data.message : 'Payment failed!! ',
                                responseData: successRes,
                            })
                            return false
                        }
                        let transactionID = 0
                        if (req.body.payment_method === 'CREDITCARD') {
                            transactionID =
                                data.responseData.transactionDetails[0].ccreferencenumber
                        } else if (req.body.payment_method === 'ACH') {
                            transactionID = data.responseData.TradeFinancialDetails[0].RefNum
                        }
                        const paylogResults = await Promise.all([
                            paymentModule.insertPayLogRequestRosoom(
                                req,
                                payCartID.toString(),
                                transactionID,
                                req.body.user_id,
                                uniq,
                                req.body.pay_type,
                                'northcapital',
                                paymentObject,
                            ),
                        ])
                        if (paylogResults[0].insertId) {
                            req.body.response = {}
                            req.body.response.status = '1'
                            req.body.response.payLogID = paylogResults[0].insertId
                            req.body.response.serviceCost = totalAmount
                            req.body.response.payment_method = req.body.payment_method
                            req.body.response.payment_type = req.body.payment_type || ''
                            req.body.response.soTransactionID = transactionID
                            req.body.response.paymentInstrument = ''
                            rosoomPaymentsuccess(req, res)
                            return false
                        }
                        successRes.result = `Please contact admin ${global.common.general.adminemail}`
                        successRes.url = ''
                        jsonResponse(res, 'error', {
                            responseType: 1,
                            message: 'Payment failed!! ',
                            responseData: successRes,
                        })
                        return false
                    }
                    finalResult(resData)
                }
            }
        } catch (e) {
            console.log('northcapital_payment', e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
    rosoomPaymentsuccess,
}