/* ============================================================================ *\
|| ########################################################################## ||
|| # 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 _ = require('underscore')
const buynowModule = require('../../modules/buynow').default
const buynowCommonCtrl = require('./common')
const commonFunction = require('../../../common/function').default
const { jsonResponse } = require('../logger')
const schemaModule = require('./schema').default
const getSingleInvoicetDetails = async (req, invoiceID) => {
let cartItems = []
;[cartItems] = await Promise.all([
buynowModule.getlotcartsdetails(
'common_invoice,id,cart_id,amount,user_id,tax_percent,total_tax,buyer_premium_percent,total_premium,shipping_percent,total_shipping,total_amount',
[invoiceID.toString()],
' common_invoice=? ',
global.configColumns.buynow.ext_name,
0,
),
])
const cartValues = {
per_total: 0,
total_amount: 0,
total_tax: 0,
total_shipping: 0,
total_premium: 0,
total_paid: 0,
total_deposit: 0,
total_due_amount: 0,
admin_fee_percent: 0,
admin_fee: 0,
cart_group: '1',
cart_id: [],
common_invoice: cartItems.length ? cartItems[0].common_invoice : 0,
user_id: cartItems.length ? cartItems[0].user_id : 0,
}
await commonFunction.asyncForEach(cartItems, async (items) => {
await buynowCommonCtrl.getCartTotal(cartValues, items, 'buynow')
})
const responseData = { cartItems, cartValues }
return responseData
}
/**
* @memberOf frontend.buynow
* @param {array} req request object
* @param {object} prdt product
* @param {buynowModule.updatecartdetails} modules
* @param {buynowModule.cartqtyproductsub} modules
* @param {buynowModule.cartqtyproduct} modules
* @param {buynowModule.insertucartdetails} modules
*/
const processAllItemscartsnew = async (req, prdt) => {
try {
let cartStatus = ''
const [cartData] = await Promise.all([buynowModule.getBuyNowCartDetails(req, prdt)])
const prdCart = cartData
prdt.qty_add = typeof prdt.qty_add !== 'undefined' ? prdt.qty_add : 1
prdt.product_type = 'buynow'
if (prdt.qty <= 0) {
cartStatus = { success: false, product_id: prdt.id, error: 'Product Sold!' }
} else if (prdt.qty - prdt.qty_add < 0) {
const availableQty = parseInt(prdt.qty, 30) - parseInt(prdt.sold, 30)
const errMsg = ` Only ${availableQty} quantity is available!`
cartStatus = { success: false, product_id: prdt.id, error: errMsg }
} else if (prdt.qty - prdt.sold === 0) {
cartStatus = { success: false, product_id: prdt.id, error: 'Product Sold!' }
} else if (prdt.qty - prdt.sold - prdt.qty_add < 0) {
const availableQty = parseInt(prdt.qty, 30) - parseInt(prdt.sold, 30)
const errMsg = ` Only ${availableQty} quantity is available!`
cartStatus = { success: false, product_id: prdt.id, error: errMsg }
} else if (prdt.market_status !== 'open') {
cartStatus = { success: false, product_id: prdt.id, error: 'Product Sold!' }
} else if (prdCart.length > 0) {
await Promise.all([
buynowModule.updatecartdetails(
req,
prdt.qty_add,
prdt.id,
req.body.user_id,
prdt.bprice,
),
buynowModule.cartqtyproductsub(prdCart[0].qty, prdt.id),
buynowModule.cartqtyproduct(prdt.qty_add, prdt.id),
])
if (
typeof global.configFeatures.cart_timer !== 'undefined' &&
global.configFeatures.cart_timer.enabled === 1 &&
!req.body.cart[0].isNoTimer
) {
await buynowModule.cartTimerUpdate(req.body.user_id)
global.io.sockets.emit('cartTimer', {
qty: prdt.qty_add,
product_id: prdt.id,
user_id: req.body.user_id,
})
}
const cartValues = await buynowCommonCtrl.cartItemsCalculations(prdt)
await Promise.all([buynowModule.updateCartData(cartValues, prdt.id, req.body.user_id)])
cartStatus = { success: true, product_id: prdt.id, error: '' }
} else {
const [insertCart] = await Promise.all([
buynowModule.insertucartdetails(
req,
prdt.qty_add,
prdt.id,
req.body.user_id,
prdt.bprice,
),
buynowModule.cartqtyproduct(prdt.qty_add, prdt.id),
])
if (
typeof global.configFeatures.cart_timer !== 'undefined' &&
global.configFeatures.cart_timer.enabled === 1 &&
!req.body.cart[0].isNoTimer
) {
await buynowModule.cartTimer(insertCart.insertId)
await buynowModule.cartTimerUpdate(req.body.user_id)
global.io.sockets.emit('cartTimer', {
...req.body.cart[0],
user_id: req.body.user_id,
})
}
const cartValues = await buynowCommonCtrl.cartItemsCalculations(prdt)
await Promise.all([buynowModule.updateCartData(cartValues, prdt.id, req.body.user_id)])
cartStatus = { success: true, product_id: prdt.id, error: '' }
}
return cartStatus
} catch (e) {
console.log('error', e)
}
}
module.exports = {
getSingleInvoicetDetails,
/**
* @memberOf frontend.buynow
* @param {object} req request object
* @param {object} prdt product
* @param {buynowModule.getBuynowProjectDetails} modules
*/
addToCart: async (req, res) => {
try {
req.body.user_id = req.user.id
if (typeof req.body.user_id === 'undefined') {
jsonResponse(res, 'error', {
responseType: 3,
message: 'Invalid Login!',
})
} else {
req.body.product_id = _.pluck(req.body.cart, 'product_id')
const [productData] = await Promise.all([buynowModule.getBuynowProjectDetails(req)])
if (!productData.length) {
jsonResponse(res, 'error', {
responseType: 3,
message: 'Product does not exist!',
})
} else {
const resultloop = []
await commonFunction.asyncForEach(productData, async (carts) => {
const qtyData = _.find(req.body.cart, { product_id: carts.id })
carts.qty_add = qtyData.qty
const looptoformat = await processAllItemscartsnew(req, carts)
resultloop.push(looptoformat)
})
await Promise.all(resultloop)
let errorMessage = 'success'
_.map(resultloop, (key, val) => {
if (!key.success) {
errorMessage = 'error'
}
})
jsonResponse(res, errorMessage, {
responseType: 3,
message:
errorMessage === 'success'
? 'Product successfully added!'
: 'Quantity not available!',
responseData: resultloop,
})
}
}
} catch (e) {
console.log('error', e)
jsonResponse(res, 'error', {
responseType: 3,
message: 'Internal Server error!',
})
}
},
/**
* checkout
* @memberOf frontend.buynow
* @param {object} req request object
* @param {object} res response object
* @param {buynowModule.getBuynowProjectDetails} modules
*/
checkout: async (req, res) => {
try {
await schemaModule.search().validateSync(req.body)
const [responseData] = await Promise.all([
buynowCommonCtrl.getSingleCartDetails(req, req.body.cart_id),
])
// only cart user allowed to access
if (responseData.cartValues.user_id !== 0) {
if (responseData.cartValues.user_id !== req.user.id) {
jsonResponse(res, 'error', {
responseType: 3,
message: 'User Access Denied!',
})
} else {
jsonResponse(res, 'success', {
responseType: 1,
message: 'Details successfully retrieved!',
responseData,
})
}
} else {
jsonResponse(res, 'success', {
responseType: 1,
message: 'Details successfully retrieved!',
responseData,
})
}
} catch (e) {
console.error(e)
jsonResponse(res, 'error', {
responseType: 3,
message: 'Internal Server error!',
})
}
},
/**
* search
* @memberOf frontend.buynow
* @param {object} req request object
* @param {object} res response object
* @param {buynowModule.getBuynowProjectDetails} modules
*/
search: async (req, res) => {
try {
await schemaModule.search().validateSync(req.body)
const allCarts = []
const getallCartsFunction = async (cartID) => {
const [responseData] = await Promise.all([
buynowCommonCtrl.getSingleCartDetails(req, cartID),
])
allCarts.push(responseData)
}
const [allCartsUsers] = await Promise.all([buynowModule.getAllTempCartsGroups(req)])
await commonFunction.asyncForEach(allCartsUsers, async (carts) => {
await getallCartsFunction(carts.id)
})
const responseData = {
// nonCartItems,
cartItems: allCarts,
}
jsonResponse(res, 'success', {
responseType: 1,
message: 'Details successfully retrieved!',
responseData,
})
} catch (e) {
console.error(e)
jsonResponse(res, 'error', {
responseType: 3,
message: 'Internal Server error!',
})
}
},
/**
* cart remove
* @memberOf frontend.buynow
* @param {object} req request object
* @param {object} res response object
* @param {buynowModule.commondeleteparenttable} modules
* @param {buynowModule.cartqtyproductsub} modules
*/
cartRemove: async (req, res) => {
try {
await Promise.all([
buynowModule.commondeleteparenttable(
req.body.cart_id,
'cart_id',
global.configColumns.cart_temp.ext_name,
),
buynowModule.cartqtyproductsub(req.body.qty, req.body.product_id),
])
if (
typeof global.configFeatures.cart_timer !== 'undefined' &&
global.configFeatures.cart_timer.enabled === 1
) {
global.io.sockets.emit('cartTimer', {
qty: req.body.qty,
product_id: req.body.product_id,
user_id: req.user.id,
})
}
jsonResponse(res, 'success', {
responseType: 1,
message: 'Removed successfully!',
})
} catch (e) {
jsonResponse(res, 'error', {
responseType: 3,
message: 'Internal Server error!',
})
}
},
}