front/controllers/buynow/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 _ = 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!',
            })
        }
    },
}