front/modules/cart.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  # ||
|| # ---------------------------------------------------------------------- # ||
|| ########################################################################## ||
\* ============================================================================ */

const dateFormat = require('dateformat')
const md5 = require('md5')
const _ = require('underscore')
const commonProduct = require('../../common/products').default
const commonSQL = require('../../common/sql').default
const mysqclass = require('./mysqli').default
/**
 * @class class to handle cart functions
 */
class cartModule {
    /**
     * All cart items fetch
     * @param {object} req req object
     * @param {number} data req.body object
     * @param {number} count count for the pagination
     * @returns {object} sql response
     */
    static async allCartItems(req, data, count) {
        const baseTableUsed = global.configColumns.buynow
        const customTableUsed = { enabled: 0 }

        const mysql = {}
        let row = ''
        let where = ''
        const order = 'b.id asc'
        const dateNow = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
        if (count === 1) {
            if (req.body.group_id) {
                where += `and b.cart_group = ${req.body.group_id} and b.in_cart = 1`
            } else if (req.body.cart_id) {
                where += `and b.id IN (${req.body.cart_id}) and b.in_cart = 1`
            } else if (req.body.invoice_id) {
                where += `and b.common_invoice IN (${req.body.invoice_id})`
            } else if (req.body.invoice_address_id) {
                where += `and b.invoice_address_id IN (${req.body.invoice_address_id}) and b.paid = 0`
            }
        } else {
            where += ' and b.in_cart = 0'
        }

        const generatedData = commonProduct.generateJoinWithColum(baseTableUsed, customTableUsed, [
            'id',
        ])

        row = 'cart_all_item'
        let uidc = 0
        if (req.body.user_id) {
            uidc = req.body.user_id
        }
        if (req.user && uidc === 0) {
            uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
        }
        const escapeData = [uidc]
        const ordergor = order === '' ? '' : `order by ${order}`

        mysql.customTableJoin = generatedData.customTableJoin
        mysql.columns = generatedData.rowstoFetch

        const additionalTable = global.configColumns.projects
        const customAdditionalTable = global.configColumns.custom_projects

        const additionalGeneratedData = commonProduct.additionalTableJoin(
            additionalTable,
            customAdditionalTable,
            baseTableUsed,
            'left join',
            'id',
            'project_id',
        )
        mysql.customTableJoin = `${mysql.customTableJoin} ${additionalGeneratedData.customTableJoin}`
        mysql.columns = mysql.columns.concat(additionalGeneratedData.rowstoFetch)

        mysql.where = where
        mysql.order = ordergor
        mysql.dateNow = dateNow
        mysql.userid = uidc

        const strQuery = await mysqclass.mysqli(mysql, row)
        console.log('strQuery', strQuery)
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * All cart items fetch
     * @param {object} req req object
     * @param {number} data req.body object
     * @param {number} count count for the pagination
     * @returns {object} sql response
     */
    static async getAllCarts(req) {
        let mysql = ''
        let row = ''
        let where = ''
        const order = 'b.id asc'
        where += ``
        row = 'cart_all_cartid'
        let uidc = 0
        if (req.user) {
            uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
        }
        const escapeData = [uidc]
        const ordergor = order === '' ? '' : `order by ${order}`
        mysql = {
            where,
            order: ordergor,
            userid: uidc,
        }

        const strQuery = await mysqclass.mysqli(mysql, row)
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * Get all sort and filtered values
     * @param {object} req req object
     * @param {object} data req.body object
     * @returns {object} sql response
     */
    static async getSearchSortCategories(req, data) {
        const mysql = {}
        const dateNow = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
        mysql.where = ''
        mysql.where += ` and p.market_status = "open" and p.date_closed >= "${dateNow}" `

        const strQuery = await mysqclass.mysqli(mysql, 'ig_571')
        const dataReturn = await global.mysql.query(strQuery)
        return dataReturn
    }

    /**
     * Check Product exists for the users
     * @param {object} req req object
     * @param {object} id project id to check
     * @returns {object} sql response
     */
    static async checkUserProductExists(req, id) {
        const mysql = {}
        let uidc = 0
        if (req.user) {
            uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
        }
        const escapeData = [uidc, id]
        const strQuery = await mysqclass.mysqli(mysql, 'check_cart_user')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * Check Product exists for the users
     * @param {object} req req object
     * @param {object} id project id to check
     * @returns {object} sql response
     */
    static async checkUserCartExists(req, locationID) {
        const mysql = {}
        let uidc = 0
        if (req.user) {
            uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
        }
        const escapeData = [uidc, locationID]
        const strQuery = await mysqclass.mysqli(mysql, 'check_cart_user_exists')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * Check User has un paid items exists
     * @param {object} req req object
     * @returns {object} sql response
     */
    static async checkUserUnPaidExists(req) {
        const mysql = {}
        let uidc = 0
        if (req.user) {
            uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
        }
        const escapeData = [uidc]
        const strQuery = await mysqclass.mysqli(mysql, 'check_cart_user_exists')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * Get all cart details
     * @param {number} cartID cart ID the details to be fetched
     * @returns {object} sql response
     */
    static async getCartDetails(cartID) {
        const mysql = {}
        const escapeData = [cartID]
        const strQuery = await mysqclass.mysqli(mysql, 'get_cart_all_data')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * cart Location Details
     * @param {number} cartID cart ID the location details to be fetched
     * @returns {object} sql response
     */
    static async cartLocationDetails(cartID) {
        const mysql = {}
        const escapeData = [cartID]
        const strQuery = await mysqclass.mysqli(mysql, 'get_cart_location_data')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * change cart status
     * @param {number} req req object
     * @param {number} cartChange cart change details
     * @param {number} id cart ID which status has to be changed
     * @returns {object} sql response
     */
    static async changeCartStatus(req, cartChange, id) {
        const mysql = {}
        let uidc = 0
        if (req.user) {
            uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
        }
        const escapeData = [cartChange, uidc, id]
        const strQuery = await mysqclass.mysqli(mysql, 'add_cart_to_user')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * add New Cart Entry
     * @param {object} req req object
     * @param {object} userDetails user details object
     * @param {number} locationID location ID which has to be added
     * @returns {object} sql response
     */
    static async addNewCartEntry(req, userDetails, locationID) {
        const mysql = {}
        const dateNow = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
        const escapeData = [
            req.user.id,
            userDetails.first_name,
            userDetails.last_name,
            userDetails.address1,
            userDetails.address2,
            userDetails.city,
            userDetails.state,
            userDetails.zip,
            locationID,
            dateNow,
        ]
        const strQuery = await mysqclass.mysqli(mysql, 'insert_new_cart_user')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * Update Cart Entry
     * @param {object} data req.body object
     * @param {number} id cart ID which has to be updated
     * @returns {object} sql response
     */
    static async updateCartData(data, id) {
        let postData = data
        const mysqli = {}
        if (postData.total_amount) {
            postData.balance_amount = postData.total_amount
        } else {
            postData.balance_amount = 0.0
        }
        const acceptedObjects = [
            'per_total',
            'total_items',
            'tax_percent',
            'total_tax',
            'buyer_premium',
            'total_premium',
            'total_shipping',
            'total_amount',
            'balance_amount',
            'bill_first_name',
            'bill_last_name',
            'bill_address1',
            'bill_address2',
            'bill_city',
            'bill_state',
            'bill_zipcode',
            'cart_paid',
        ]
        postData = _.omit(postData, (value, key) => {
            if (
                _.isNull(value) ||
                _.isUndefined(value) ||
                value === '' ||
                !_.contains(acceptedObjects, key)
            ) {
                return true
            }
            return false
        })
        let escapeData = []
        const defaultKeys = ['updated_at']
        const defaultValues = [dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')]
        const keyswithescape = defaultKeys.concat(_.keys(postData))
        escapeData = defaultValues.concat(_.values(postData))
        mysqli.keys = _.map(keyswithescape, (val) => {
            return `${val} = ?`
        })
        mysqli.cart_id = id
        const strQuery = await mysqclass.mysqli(mysqli, 'update_cart_details')
        const dataPromise = await global.mysql.query(strQuery, escapeData)
        return dataPromise
    }

    /**
     * get All Pending Cart ID
     * @param {object} req req object
     * @returns {object} sql response
     */
    static async getAllPendingCartID(req) {
        const mysql = {}
        let where = ''
        let uidc = 0
        if (req.user) {
            uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
        }
        if (req.body.filters) {
            where += commonProduct.filterData(req)
        }
        const escapeData = [uidc]
        const strQuery = await mysqclass.mysqli(mysql, 'get_all_pending_carts')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * get All Pending Cart Items
     * @param {object} req req object
     * @param {number} cartID cart ID which items has to be fetched
     * @returns {object} sql response
     */
    static async getAllPendingCartItems(req, baseTableUsed) {
        const mysql = {}
        let where = ''
        let uidc = 0
        if (req.user) {
            uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
        }

        if (req.body.filters) {
            where += commonProduct.filterData(req)
        }
        mysql.where = where
        mysql.field = req.body.field
        mysql.extraField = req.body.extraField ? req.body.extraField : ''

        mysql.mainTableJoin = `${baseTableUsed.ext_name} as ${baseTableUsed.short_name}`
        const escapeData = [uidc]

        const strQuery = await mysqclass.mysqli(mysql, 'get_all_count_pending_cart')

        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * update cart
     * @param {number} req req object
     * @returns {object} sql response
     */
    static async updateCheckout(item) {
        const mysql = {}
        const postData = item
        const acceptedObjects = ['invoice_address_id']
        let escapeData = []
        const defaultKeys = []
        const defaultValues = []
        const valueInsert = commonSQL.updateSQLFunction(
            postData,
            acceptedObjects,
            defaultKeys,
            defaultValues,
        )
        mysql.keys = valueInsert.keys
        escapeData = valueInsert.escapeData
        mysql.invoice_id = item.invoice_id

        const strQuery = await mysqclass.mysqli(mysql, 'update_buynow_checkout')
        let dataPromise = ''
        if (mysql.keys.length) {
            dataPromise = await global.mysql.query(strQuery, escapeData)
        } else {
            dataPromise = Promise.resolve()
        }
        return dataPromise
    }

    /**
     * update invoice
     * @param {number} req req object
     * @returns {object} sql response
     */
    static async updateInvoice(req) {
        const mysql = {}
        let uidc = 0
        if (req.user) {
            uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
        }
        const escapeData = [
            req.tax_percent,
            req.total_tax,
            req.total_premium,
            req.buyer_premium_percent,
            req.shipping_percent,
            req.total_shipping,
            req.per_total,
            req.per_total,
            req.total_amount,
            req.invoice_address_id,
            req.changed_user_id ? req.changed_user_id : req.user_id,
            req.user_id,
            req.id,
        ]
        const strQuery = await mysqclass.mysqli(mysql, 'update_invoice')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * update buyer premium
     * @param {object} data data
     * @param {number} pid project id
     */
    static async updateBuyerPremium(data, pid) {
        const mysql = {}
        const escapeData = [data, pid]
        const strQuery = await mysqclass.mysqli(mysql, 'update_premium')
        const dataReturn = await global.mysqlsingle.query(strQuery, escapeData)
        return dataReturn
    }
}

module.exports.default = cartModule