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