front/modules/product.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 mysqclass = require('./mysqli').default
const commonSQL = require('../../common/sql').default
const commonProduct = require('../../common/products').default
const commonFunction = require('../../common/function').default
/**
 * @class class to handle product functions
 */
class productModule {
    /**
     * Search all the search products
     * @param {object} req req object
     * @param {object} data req.body object
     * @param {number} count count for the pagination
     * @returns {object} sql response
     */
    static async searchProducts(req, data, count) {
        const mysql = {}
        const baseTableUsed = global.configColumns.projects
        const customTableUsed = global.configColumns.custom_projects

        let row = ''
        let where = ''
        let limitf = ''
        let order = ''
        const dateNow = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
        if (typeof req.body.limit === 'undefined') {
            req.body.limit = global.configurations.variables.search_limit || 25
        }
        if (typeof req.body.page === 'undefined') {
            req.body.page = 1
        }

        order = ` ORDER BY p.id desc`
        if (req.body.orderby || req.body.order) {
            const sortReturn = commonProduct.sortOrderData(req, where)
            if (sortReturn.order) {
                order = sortReturn.order
            }
            if (sortReturn.where) {
                where += sortReturn.where
            }
        }

        if (req.body.similars) {
            where += commonProduct.similarData(req)
        }
        if (req.body.filters) {
            where += commonProduct.filterData(req)
        }
        if (req.body.market_status) {
            if (Array.isArray(req.body.market_status)) {
                const values = req.body.market_status.join('","')
                where += ` AND p.market_status in ("${values}") `
            } else if (typeof req.body.market_status === 'string') {
                where += ` AND p.market_status = "${req.body.market_status}" `
            }
        } else {
            where += `and p.market_status = "open" and p.date_closed >= "${dateNow}" `
        }

        if (data.type === 'live') {
            where += ` and p.date_added <= "${dateNow}" `
        }

        if (req.user && req.user.id) {
            where += ` and (p.selltype=1 and FIND_IN_SET("${req.user.id}", p.selectedbuyer) or p.selltype=0 ) `
        } else {
            where += ` and p.selltype=0 `
        }
        const generatedData = commonProduct.generateJoinWithColum(baseTableUsed, customTableUsed, [
            'id',
        ])

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

        const additionalTable = global.configColumns.auctionlot
        const customAdditionalTable = global.configColumns.custom_auctionlot

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

        mysql.customTableJoin2 = ''
        mysql.columns2 = ''
        if (global.configFeatures.custom_nellis_employee_join) {
            mysql.columns2 =
                ', nellis_e.firstName as empFirstName, nellis_e.lastName as empLastName'
            mysql.customTableJoin2 =
                'left join employees as nellis_e on it.employeeId = nellis_e.id'
        }

        mysql.locationJoin = ''
        if (global.configFeatures.nellis_state_city_filter) {
            mysql.locationJoin = 'left join locations as l on l.id = p.location_id'
            if (typeof req.body.filters.currentLocation !== 'undefined') {
                where += ` and l.state = "${req.body.filters.currentLocation.state}" and l.city = "${req.body.filters.currentLocation.city}"`
            }
        }

        if (typeof global.configFeatures.deposit_on_project !== 'undefined') {
            if (global.configFeatures.deposit_on_project.enabled && req.user && req.user.id) {
                const additionalTableDeposit = global.configColumns.bid_deposit
                const customAdditionalTableDeposit = { enabled: 0 }

                const additionalDepositGeneratedData = commonProduct.additionalTableJoin(
                    additionalTableDeposit,
                    customAdditionalTableDeposit,
                    baseTableUsed,
                    'left join',
                    'type_id',
                    'id',
                )
                mysql.customTableJoin += ` ${additionalDepositGeneratedData.customTableJoin} and ${additionalTableDeposit.short_name}.user_id = ${req.user.id} `
                mysql.columns = mysql.columns.concat(additionalDepositGeneratedData.rowstoFetch)
            }
        }

        row = count === 1 ? 'ingram_13' : 'ingram_13a'
        const limitrg = req.body.limit
        let uidc = 0
        if (req.user) {
            uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
        }

        const escapeData = []
        if (count === 1) {
            let pagen = (req.body.page - 1) * limitrg
            if (parseInt(pagen, 10) < 0) {
                pagen = 0
            }
            limitf = ` limit ${pagen},${limitrg}`
        }

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

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

    /**
     * Search all the dashboard products
     * @param {object} req req object
     * @param {object} data req.body object
     * @param {number} count count for the pagination
     * @returns {object} sql response
     */
    static async searchDashboardProducts(req, data, count) {
        const actionValue = data.action
        const mysql = {}

        let row = ''
        let where = ''
        let having = ''
        let limitf = ''
        let order = ''
        const dateNow = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')

        let uidc = 0
        if (req.user) {
            uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
        }

        order = ` ORDER BY p.id desc`
        if (req.body.orderby || req.body.order) {
            const sortReturn = commonProduct.sortOrderData(req, where)
            if (sortReturn.order) {
                order = sortReturn.order
            }
            if (sortReturn.where) {
                where += sortReturn.where
            }
        }

        if (req.body.similars) {
            where += commonProduct.similarData(req)
        }
        if (req.body.filters) {
            where += commonProduct.filterData(req)
        }
        if (req.body.having) {
            having += commonProduct.havingData(req)
        }

        if (actionValue !== '') {
            if (
                actionValue === 'auction' ||
                actionValue === 'all' ||
                actionValue === 'winning' ||
                actionValue === 'outbid' ||
                actionValue === 'lost'
            ) {
                row = count === 1 ? 'dash_auction_item' : 'dash_auction_item_count'

                if (actionValue === 'winning') {
                    where += ` and p.market_status = "open"`
                    where += ` and p.date_closed >= "${dateNow}" `
                    where += `and (select IFNULL(bb.user_id,0) as latestbiduser_id from bids AS bb where bb.project_id = p.id and bb.proposal != "tie_bid" order by bb.proposed_amount desc limit 1) = "${uidc}"`
                } else if (actionValue === 'outbid') {
                    where += ` and p.market_status = "open"`
                    where += ` and p.date_closed >= "${dateNow}" `
                    where += `and (select IFNULL(bb.user_id,0) as latestbiduser_id from bids AS bb where bb.project_id = p.id and bb.proposal != "tie_bid" order by bb.proposed_amount desc limit 1) != "${uidc}"`
                } else if (req.body.is_past_auction) {
                    where += ` `
                } else {
                    where += ` and (p.market_status = "open" or p.market_status = "sold")`
                }
            } else if (actionValue === 'watchlist') {
                if (!req.body.is_custom_check)
                    where += ` and p.market_status = "open" and p.date_closed >= "${dateNow}" `
                row = count === 1 ? 'dash_watchlist_item' : 'dash_watchlist_item_count'
            } else if (actionValue === 'won') {
                row = count === 1 ? 'dash_won_item' : 'dash_won_item_count'
            } else if (actionValue === 'buynow') {
                row = count === 1 ? 'dash_buynow_item' : 'dash_buynow_item_count'
            }
        }

        if (actionValue === 'won' || actionValue === 'buynow') {
            const baseTableUsed = global.configColumns.projects
            const customTableUsed = global.configColumns.custom_projects

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

            mysql.customTableJoin = generatedData.customTableJoin
            mysql.columns = generatedData.rowstoFetch
            mysql.mainTable = generatedData.mainTableJoin

            const additionalTable = global.configColumns.buynow
            const customAdditionalTable = { enabled: 0 }

            const additionalGeneratedData = commonProduct.additionalTableJoin(
                additionalTable,
                customAdditionalTable,
                baseTableUsed,
                'inner join',
                'project_id',
                'id',
            )
            mysql.customTableJoin = `${mysql.customTableJoin} ${additionalGeneratedData.customTableJoin}`
            mysql.columns = mysql.columns.concat(additionalGeneratedData.rowstoFetch)
        } else {
            const baseTableUsed = global.configColumns.projects
            const customTableUsed = global.configColumns.custom_projects

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

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

            if (typeof global.configFeatures.deposit_on_project !== 'undefined') {
                if (global.configFeatures.deposit_on_project.enabled && req.user && req.user.id) {
                    const additionalTableDeposit = global.configColumns.bid_deposit
                    const customAdditionalTableDeposit = { enabled: 0 }

                    const additionalDepositGeneratedData = commonProduct.additionalTableJoin(
                        additionalTableDeposit,
                        customAdditionalTableDeposit,
                        baseTableUsed,
                        'left join',
                        'type_id',
                        'id',
                    )
                    mysql.customTableJoin += ` ${additionalDepositGeneratedData.customTableJoin} and ${additionalTableDeposit.short_name}.user_id = ${req.user.id} `
                    mysql.columns = mysql.columns.concat(additionalDepositGeneratedData.rowstoFetch)
                }
            }
        }

        const limitrg = req.body.limit
        const escapeData = []
        if (count === 1) {
            let pagen = (req.body.page - 1) * limitrg
            if (parseInt(pagen, 10) < 0) {
                pagen = 0
            }
            limitf = ` limit ${pagen},${limitrg}`
        }

        mysql.order = order
        mysql.where = where
        mysql.having = having
        mysql.limitf = limitf
        mysql.dateNow = dateNow
        mysql.userid = uidc

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

    /**
     * Search all the invoice products
     * @param {object} req req object
     * @param {object} data req.body object
     * @param {number} count count for the pagination
     * @returns {object} sql response
     */
    static async searchInvoiceProducts(req, data, count) {
        let mysql = ''
        let row = ''
        let order = ''
        const sortorder = data.orderby
        const actionValue = data.action
        let where = ''
        let limitf = ''
        let uidc = 0
        if (req.user) {
            uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
        }

        if (req.body.paid) {
            where += ` and pc.cart_paid = 1`
        }

        if (req.body.checkout) {
            where += ` and pc.cart_checkout = 1`
        }

        if (req.body.unpaid) {
            where += ` and pc.cart_paid = 0`
        }

        order = 'pc.cart_paiddate desc'
        row = count === 1 ? 'invoice_item' : 'invoice_item_count'
        const limitrg = req.body.limit
        const escapeData = []
        if (count === 1) {
            let pagen = (req.body.page - 1) * limitrg
            if (parseInt(pagen, 10) < 0) {
                pagen = 0
            }
            limitf = ` limit ${pagen},${limitrg}`
        }
        const ordergor = order === '' ? '' : `order by ${order}`
        mysql = {
            where,
            order: ordergor,
            limitf,
            userid: uidc,
        }

        const strQuery = await mysqclass.mysqli(mysql, row)
        console.log('row', strQuery)
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * Search all the new invoice products
     * @param {object} req req object
     * @param {object} data req.body object
     * @param {number} count count for the pagination
     * @returns {object} sql response
     */
    static async searchInvoiceProductsNew(req, data, count) {
        let mysql = ''
        let row = ''
        let order = ''
        const sortorder = data.orderby
        const actionValue = data.action
        let where = ''
        let limitf = ''
        let uidc = 0
        if (req.user) {
            uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
        }

        if (req.body.checkout) {
            where += ` and b.paid = 1 `
        } else {
            where += ` and b.paid = 0 AND partial = 0`
        }

        order = 'b.id desc'
        row = count === 1 ? 'invoice_item_new' : 'invoice_item_new_count'
        const limitrg = req.body.limit
        const escapeData = []
        if (count === 1) {
            let pagen = (req.body.page - 1) * limitrg
            if (parseInt(pagen, 10) < 0) {
                pagen = 0
            }
            limitf = ` limit ${pagen},${limitrg}`
        }
        const ordergor = order === '' ? '' : `order by ${order}`
        mysql = {
            where,
            order: ordergor,
            limitf,
            userid: uidc,
        }

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

    /**
     * Search all the return products
     * @param {object} req req object
     * @param {object} data req.body object
     * @param {number} count count for the pagination
     * @returns {object} sql response
     */
    static async searchReturnProducts(req, data, count) {
        let mysql = ''
        let row = ''
        let order = ''
        const sortorder = data.orderby
        const actionValue = data.action
        let where = ''
        let limitf = ''
        let uidc = 0
        if (req.user) {
            uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
        }

        if (req.body.paid) {
            where += ` and rc.paid = 1`
        }

        if (req.body.checkout) {
            where += ` and rc.checkout = 1`
        }

        if (req.body.unpaid) {
            where += ` and rc.paid = 0`
        }

        order = 'rc.paiddate desc'
        row = count === 1 ? 'return_item' : 'return_item_count'
        const limitrg = req.body.limit
        const escapeData = []
        if (count === 1) {
            let pagen = (req.body.page - 1) * limitrg
            if (parseInt(pagen, 10) < 0) {
                pagen = 0
            }
            limitf = ` limit ${pagen},${limitrg}`
        }
        const ordergor = order === '' ? '' : `order by ${order}`
        mysql = {
            where,
            order: ordergor,
            limitf,
            userid: uidc,
        }

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

    /**
     * getch all attachments
     * @param {number} pid project id
     * @returns {object} sql response
     */
    static async fetchAllAttachments(pid) {
        const mysql = {}
        const escapeData = [pid]
        const strQuery = await mysqclass.mysqli(mysql, 'im_26')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * check bid placed without login
     * @param {number} pid project id
     * @returns {object} sql response
     */
    static async checkbidPlacedwhoutlogin(pid) {
        const mysql = {}
        const escapeData = [pid]
        const strQuery = await mysqclass.mysqli(mysql, 'im_818')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * check bid placed without login
     * @param {number} pid project id
     * @param {string} type type
     * @returns {object} sql response
     */
    static async getProxyDetails(pid, type) {
        const mysql = {}
        let escapeData = []
        if (type === 'get_highest_biduser') {
            escapeData = [pid, 0]
        } else if (type === 'second_highest_biduser') {
            escapeData = [pid, 1]
        }
        const strQuery = await mysqclass.mysqli(mysql, 'get_proxy_details')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * bids notify all
     * @param {number} pid project id
     * @param {number} uid user id
     * @returns {object} sql response
     */
    static async bidsnotifyall(pid, uid) {
        const mysql = {}
        mysql.where = ''
        const escapeData = [pid, uid]
        const strQuery = await mysqclass.mysqli(mysql, 'im_822')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * bids awarded
     * @param {number} pid project id
     * @param {number} uid user id
     * @returns {object} sql response
     */
    static async bidsawarded(pid, uid) {
        const mysql = {}
        const escapeData = [pid, uid]
        const strQuery = await mysqclass.mysqli(mysql, 'im_823')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * get user proxy amt
     * @param {number} pid project id
     * @param {number} uid user id
     * @returns {object} sql response
     */
    static async getUserProxyAmt(pid, uid) {
        const mysql = {}
        const escapeData = [pid, uid]
        const strQuery = await mysqclass.mysqli(mysql, 'im_824')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * Fetch All Bid history
     * @param {object} id project id
     * @param {number} cnt count for the pagination
     * @returns {object} sql response
     */
    static async isbuyerbidstarted(pid, uid) {
        const mysql = {}
        const escapeData = [pid, uid]
        const strQuery = await mysqclass.mysqli(mysql, 'im_821')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * Fetch All Bid history
     * @param {object} id project id
     * @param {number} cnt count for the pagination
     * @returns {object} sql response
     */
    static async bidHistory(id, cnt) {
        const mysql = {}
        let row = ''
        if (cnt === 1) {
            row = 'im_45'
        } else {
            row = 'im_44'
        }
        const escapeData = [id]
        const strQuery = await mysqclass.mysqli(mysql, row)
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * Fetch Bid history
     * @param {object} req req.body
     * @param {number} count count for the pagination
     * @returns {object} sql response
     */
    static async bidHistoryViewPage(req, count) {
        const mysql = {}
        mysql.where = ''
        const dateNow = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
        mysql.order = 'order by bh.id desc'
        const order = req.body.order === '' ? 'asc' : req.body.order
        const orderby = req.body.orderby === '' && !req.body.orderby ? '' : req.body.orderby
        if (orderby !== '') {
            mysql.order = ` order by ${orderby} ${order}`
        }
        // if (req.body.searchterm !== '' && req.body.searchterm !== undefined) {
        //     let changed = req.body.searchterm.replace(/\\/g, '\\\\\\\\')
        //     changed = changed.replace(/"/g, '\\"')
        //     mysql.where += `and (u.first_name like "%${changed}%" or p.id like "%${changed}%")`
        // }
        let row = ''
        const pagen = (req.body.page - 1) * req.body.limit
        const limitf = ` limit ${pagen},${req.body.limit}`
        mysql.limit = limitf
        mysql.dateNow = dateNow
        const escapeData = [req.body.id]
        if (count === 1) {
            row = 'get_all_bid_history_limit'
        } else {
            row = 'get_all_bid_history'
        }
        const strQuery = await mysqclass.mysqli(mysql, row)
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * ttw bid history
     * @param {number} pid project id
     * @param {number} uid user id
     * @returns {object} sql response
     */
    static async ttwBidHistory(req, count) {
        const mysql = {}
        mysql.where = ''
        const dateNow = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
        mysql.order = ''
        let row = ''
        if (req.body.user_id) mysql.where += ` and b.user_id = "${req.body.user_id}" `
        const pagen = (req.body.page - 1) * req.body.limit
        const limitf = ` limit ${pagen},${req.body.limit}`
        mysql.limit = limitf
        mysql.dateNow = dateNow
        const escapeData = [req.body.id]
        if (count === 1) {
            row = 'get_all_ttwbid_history_limit'
        } else {
            row = 'get_all_ttwbid_history'
        }
        const strQuery = await mysqclass.mysqli(mysql, row)
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * get second higest bidder ttw
     * @param {number} id project id
     * @returns {object} sql response
     */
    static async getSecondHighestBidderTTW(id) {
        const mysql = {}
        let row = 'getSecondHighestBidderTTW'
        const escapeData = [id, id]
        const strQuery = await mysqclass.mysqli(mysql, row)
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * get private Sold Quantity
     * @param {object} id project id
     * @param {number} id project id
     * @returns {object} sql response
     */
    static async getPrivateSoldQty(req, id) {
        const mysql = {}
        let row = 'privateSoldQty'
        const escapeData = [id, req.user.id || 0]
        const strQuery = await mysqclass.mysqli(mysql, row)
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * get search sort categories
     * @param {object} id project id
     * @returns {object} sql response
     */
    static async getSearchSortCategories(req, data) {
        const mysql = {}
        const dateNow = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
        mysql.where = ''
        const selectQuery = []
        const processAllItems = async (items) => {
            const tableValue = global.configColumns[items]
            if (tableValue.search && tableValue.enabled && tableValue.foreign_key) {
                selectQuery.push(
                    `GROUP_CONCAT(DISTINCT ${tableValue.foreign_key} ORDER BY ${tableValue.foreign_key}) as sort${tableValue.ext_name}`,
                )
            }
        }

        await commonFunction.asyncForEach(Object.keys(global.configColumns), async (element) => {
            await processAllItems(element)
        })
        const customProject = global.configColumns.custom_projects
        if (req.body.market_status) {
            if (Array.isArray(req.body.market_status)) {
                const values = req.body.market_status.join('","')
                mysql.where += ` AND p.market_status in ("${values}") `
            } else if (typeof req.body.market_status === 'string') {
                mysql.where += ` AND p.market_status = "${req.body.market_status}" `
            }
        } else {
            mysql.where += ` and p.market_status = "open" and p.date_closed >= "${dateNow}" `
        }
        mysql.selectQuery = selectQuery.toString()
        mysql.customProject = customProject.ext_name
        mysql.customProjectAlis = customProject.short_name
        if (customProject.foreign_key) {
            mysql.customProjectJoin = `p.id = ${customProject.short_name}.${customProject.foreign_key}`
        } else {
            mysql.customProjectJoin = `${customProject.short_name}.id = p.item_id`
        }

        mysql.locationJoin = ''
        if (global.configFeatures.nellis_state_city_filter) {
            mysql.locationJoin = 'left join locations as l on l.id = p.location_id'
            if (typeof req.body.filters.currentLocation !== 'undefined') {
                mysql.where += ` and l.state = "${req.body.filters.currentLocation.state}" and l.city = "${req.body.filters.currentLocation.city}"`
            }
        }

        if (req.body.filters) {
            mysql.where += commonProduct.filterData(req)
        }

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

    /**
     * all invlice Items
     * @param {number} id project id
     * @param {object} data data
     * @param {number} count count
     * @returns {object} sql response
     */
    static async allInvoiceItems(req, data, count) {
        const baseTableUsed = global.configColumns.buynow
        const customTableUsed = global.configColumns.projects

        const mysql = {}
        let row = ''
        let where = ''
        const order = 'p.date_closed asc'
        const dateNow = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
        where += `and b.common_invoice = ${req.body.invoice_id}`
        row = 'invoice_all_item'
        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}`

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

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

        req.body.page = req.body.page || 1
        req.body.limit = req.body.limit || 25
        const pagen = (req.body.page - 1) * req.body.limit
        const limitf = ` limit ${pagen},${req.body.limit}`

        mysql.mainTable = ` ${global.configColumns.buynow.ext_name} as b `
        mysql.limitf = limitf
        mysql.where = where
        mysql.order = ordergor
        mysql.dateNow = dateNow
        mysql.userid = uidc

        const strQuery = await mysqclass.mysqli(mysql, row)
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * all invlice Items
     * @param {number} cartid cart id
     * @returns {object} sql response
     */
    static async getInvoiceCartDetails(cartID) {
        const mysql = {}
        const escapeData = [cartID]
        const strQuery = await mysqclass.mysqli(mysql, 'get_cart_invoice_all_data')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * get All Transactions
     * @param {number} cartID cart id
     * @returns {object} sql response
     */
    static async getAllTransactions(cartID) {
        const mysql = {}
        const escapeData = [cartID]
        const strQuery = await mysqclass.mysqli(mysql, 'get_cart_invoice_transactions_data')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * get Appointment Deatails
     * @param {number} cartID cart id
     * @returns {object} sql response
     */
    static async getAppointmentDetails(cartID) {
        const mysql = {}
        const escapeData = [cartID]
        const strQuery = await mysqclass.mysqli(mysql, 'get_cart_invoice_appointment_data')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * get location details
     * @param {number} cartID cart id
     * @returns {object} sql response
     */
    static async getLocationDetails(cartID) {
        const mysql = {}
        const escapeData = [cartID]
        const strQuery = await mysqclass.mysqli(mysql, 'get_cart_invoice_location_data')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * all return invoice times
     * @param {number} cartID cart id
     * @param {string} data data
     * @param {number} count count
     * @returns {object} sql response
     */
    static async allReturnInvoiceItems(req, data, count) {
        const baseTableUsed = global.configColumns.projects
        const customTableUsed = global.configColumns.custom_projects

        const mysql = {}
        let row = ''
        let where = ''
        const order = 'p.date_closed asc'
        const dateNow = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
        where += `and b.return_invoice = ${req.body.invoice_id}`
        row = 'returninvoice_all_item'
        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}`
        const generatedData = commonProduct.generateJoinWithColum(baseTableUsed, customTableUsed, [
            'id',
        ])

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

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

        const strQuery = await mysqclass.mysqli(mysql, row)
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * get return invoice cart details
     * @param {number} cartID cart id
     * @returns {object} sql response
     */
    static async getReturnInvoiceCartDetails(cartID) {
        const mysql = {}
        const escapeData = [cartID]
        const strQuery = await mysqclass.mysqli(mysql, 'get_cart_returninvoice_all_data')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * get all return transactions
     * @param {number} cartID cart id
     * @returns {object} sql response
     */
    static async getAllReturnTransactions(cartID) {
        const mysql = {}
        const escapeData = [cartID]
        const strQuery = await mysqclass.mysqli(mysql, 'get_cart_returninvoice_transactions_data')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * get return appointment details
     * @param {number} cartID cart id
     * @returns {object} sql response
     */
    static async getReturnAppointmentDetails(cartID) {
        const mysql = {}
        const escapeData = [cartID]
        const strQuery = await mysqclass.mysqli(mysql, 'get_cart_returninvoice_appointment_data')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * get return location details
     * @param {number} cartID cart id
     * @returns {object} sql response
     */
    static async getReturnLocationDetails(cartID) {
        const mysql = {}
        const escapeData = [cartID]
        const strQuery = await mysqclass.mysqli(mysql, 'get_cart_returninvoice_location_data')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * post product
     * @param {object} req request object
     * @returns {object} sql response
     */
    static async postproduct(req, data) {
        const mysqli = {}
        let escapeData = []
        const baseTableUsed = global.configColumns.projects
        const postData = data
        const acceptedObjects = baseTableUsed.array_columns
        const defaultKeys = ['created_at', 'updated_at']
        const defaultValues = [
            dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss'),
            dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss'),
        ]
        const valueInsert = commonSQL.InsertSQLFunction(
            postData,
            acceptedObjects,
            defaultKeys,
            defaultValues,
        )
        mysqli.keys = valueInsert.keys
        escapeData = valueInsert.escapeData
        mysqli.values = valueInsert.values
        mysqli.tables = baseTableUsed.ext_name
        const strQuery = await mysqclass.mysqli(mysqli, 'insert_tables')
        const dataPromise = await global.mysql.query(strQuery, escapeData)
        return dataPromise
    }
    /**
     *  post listing custom
     * @param {object} req request object
     * @param {data} data data
     * @param {number} proID project id
     */
    static async postlistingCustom(req, data, proID) {
        const mysqli = {}
        let escapeData = []
        const customTableUsed = global.configColumns.custom_projects
        const postData = data
        postData.product_id = proID
        const acceptedObjects = customTableUsed.array_columns
        const defaultKeys = ['created_at']
        const defaultValues = [dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')]
        const valueInsert = commonSQL.InsertSQLFunction(
            postData,
            acceptedObjects,
            defaultKeys,
            defaultValues,
        )
        mysqli.keys = valueInsert.keys
        escapeData = valueInsert.escapeData
        mysqli.values = valueInsert.values
        mysqli.tables = customTableUsed.ext_name
        const strQuery = await mysqclass.mysqli(mysqli, 'insert_tables')
        const dataPromise = await global.mysql.query(strQuery, escapeData)
        return dataPromise
    }
    /**
     *  update product
     * @param {object} req request object
     * @param {data} data data
     */
    static async updateproduct(req, data) {
        const mysqli = {}
        let escapeData = []
        const baseTableUsed = global.configColumns.projects
        const postData = data
        const acceptedObjects = baseTableUsed.array_columns
        const defaultKeys = ['updated_at']
        const defaultValues = [dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')]
        const valueInsert = commonSQL.updateSQLFunction(
            postData,
            acceptedObjects,
            defaultKeys,
            defaultValues,
        )
        mysqli.keys = valueInsert.keys
        escapeData = valueInsert.escapeData
        mysqli.values = ` id=${req.body.id}`
        mysqli.tables = baseTableUsed.ext_name
        const strQuery = await mysqclass.mysqli(mysqli, 'update_tables')
        const dataPromise = await global.mysql.query(strQuery, escapeData)
        return dataPromise
    }
    /**
     * update listing custom
     * @param {object} req request object
     * @param {object} data data
     * @param {number} proID project id
     * @returns {object} sql response
     */
    static async updatelistingCustom(req, data, proID) {
        const mysqli = {}
        let escapeData = []
        const customTableUsed = global.configColumns.custom_projects
        const postData = data
        const acceptedObjects = customTableUsed.array_columns
        const defaultKeys = ['updated_at']
        const defaultValues = [dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')]
        const valueInsert = commonSQL.updateSQLFunction(
            postData,
            acceptedObjects,
            defaultKeys,
            defaultValues,
        )
        mysqli.keys = valueInsert.keys
        escapeData = valueInsert.escapeData
        mysqli.values = `product_id =${req.body.id}`
        mysqli.tables = customTableUsed.ext_name
        const strQuery = await mysqclass.mysqli(mysqli, 'update_tables')
        const dataPromise = await global.mysql.query(strQuery, escapeData)
        return dataPromise
    }
    /**
     * add attachemnt
     * @param {object} data data
     * @param {number} proid project id
     * @returns {object} sql response
     */
    static async addattachement(data, proid) {
        const mysqli = {}
        const escapeData = [
            proid,
            data.file_name,
            1,
            data.user_id,
            data.orderby,
            dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss'),
        ]
        mysqli.keys = 'project_id,file_name,type,user_id,orderby,created_at'
        mysqli.values = '?,?,?,?,?'
        mysqli.tables = ' attachments '
        const strQuery = await mysqclass.mysqli(mysqli, 'insert_tables')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * common select parent table
     *  @param {object} data data
     *  @param {number} baseid base id
     *  @param {number} proid project id
     *  @param {string} baseTableUsed base table name
     * @returns {object} sql response
     */
    static async commonselectparenttable(data, baseid, proid, baseTableUsed) {
        const mysqli = {}
        const proId = proid.split(',')
        const escapeData = [proId]
        mysqli.keys = data
        mysqli.values = `${baseid} IN (?)`
        mysqli.tables = baseTableUsed.ext_name
        mysqli.group_by = ''
        mysqli.order_by = ''
        mysqli.limit_by = ''
        const strQuery = await mysqclass.mysqli(mysqli, 'select_tables')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * add category
     *  @param {object} req request data
     *  @param {object} data data
     * @returns {object} sql response
     */
    static async addcategory(req, data) {
        const mysqli = {}
        let escapeData = []
        const tableUsed = 'categories'
        const postData = data
        const acceptedObjects = global.configColumns[tableUsed].array_columns
        const defaultKeys = ['created_at']
        const defaultValues = [dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')]
        const valueInsert = commonSQL.InsertSQLFunction(
            postData,
            acceptedObjects,
            defaultKeys,
            defaultValues,
        )
        mysqli.keys = valueInsert.keys
        escapeData = valueInsert.escapeData
        mysqli.values = valueInsert.values
        mysqli.tables = tableUsed
        const strQuery = await mysqclass.mysqli(mysqli, 'insert_tables')
        const dataPromise = await global.mysql.query(strQuery, escapeData)
        return dataPromise
    }
    /**
     * update category
     *  @param {object} req request data
     *  @param {object} data data
     * @returns {object} sql response
     */
    static async updatecategory(req, data) {
        const mysqli = {}
        let escapeData = []
        const tableUsed = 'categories'
        const postData = data
        const acceptedObjects = global.configColumns[tableUsed].array_columns
        const defaultKeys = ['created_at']
        const defaultValues = [dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')]
        const valueInsert = commonSQL.updateSQLFunction(
            postData,
            acceptedObjects,
            defaultKeys,
            defaultValues,
        )
        mysqli.keys = valueInsert.keys
        escapeData = valueInsert.escapeData
        mysqli.values = ` id=${req.body.id}`
        mysqli.tables = tableUsed
        const strQuery = await mysqclass.mysqli(mysqli, 'update_tables')
        const dataPromise = await global.mysql.query(strQuery, escapeData)
        return dataPromise
    }
    /**
     * add attachment to product
     *  @param {object} req request data
     *  @param {object} data data
     * @returns {object} sql response
     */
    static async addattachementtoproduct(data, proid) {
        const mysqli = {}
        const escapeData = [data, proid]
        mysqli.keys = ' avatar=?'
        mysqli.values = ' id=?'
        mysqli.tables = ' projects '
        const strQuery = await mysqclass.mysqli(mysqli, 'update_tables')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * delete attachment
     *  @param {object} req request data
     *  @param {number} proid proid
     * @returns {object} sql response
     */
    static async deleteattachement(req, proid) {
        const mysqli = {}
        const escapeData = [proid]
        mysqli.keys = ''
        mysqli.values = ' project_id=?'
        mysqli.tables = ' attachments '
        const strQuery = await mysqclass.mysqli(mysqli, 'delete_tables')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * post all type of listing
     *  @param {object} req request data
     *  @param {object} data data
     *  @param {string} baseTableUsed base table used
     */
    static async postalltypeoflisting(req, data, baseTableUsed) {
        const mysqli = {}
        let escapeData = []
        const postData = data
        const acceptedObjects = baseTableUsed.array_columns
        const defaultKeys = ['created_at', 'updated_at']
        const defaultValues = [
            dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss'),
            dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss'),
        ]
        const valueInsert = commonSQL.InsertSQLFunction(
            postData,
            acceptedObjects,
            defaultKeys,
            defaultValues,
        )
        mysqli.keys = valueInsert.keys
        escapeData = valueInsert.escapeData
        mysqli.values = valueInsert.values
        mysqli.tables = baseTableUsed.ext_name
        const strQuery = await mysqclass.mysqli(mysqli, 'insert_tables')
        const dataPromise = await global.mysql.query(strQuery, escapeData)
        return dataPromise
    }
    /**
     * update all type of product
     *  @param {object} req request data
     *  @param {object} data data
     *  @param {number} proid proid
     *  @param {string} typeoffield type of field
     *  @param {string} baseTableUsed base table used
     * @returns {object} sql response
     */
    static async updatealltypeofproduct(req, data, proid, typeoffield, baseTableUsed) {
        const mysqli = {}
        let escapeData = []
        const postData = data
        const postID = proid
        const fieldType = typeoffield
        const acceptedObjects = baseTableUsed.array_columns
        const defaultKeys = ['updated_at']
        const defaultValues = [dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')]
        const valueInsert = commonSQL.updateSQLFunction(
            postData,
            acceptedObjects,
            defaultKeys,
            defaultValues,
        )
        mysqli.keys = valueInsert.keys
        escapeData = valueInsert.escapeData
        mysqli.values = ` ${fieldType}=${postID}`
        mysqli.tables = baseTableUsed.ext_name
        const strQuery = await mysqclass.mysqli(mysqli, 'update_tables')
        const dataPromise = await global.mysql.query(strQuery, escapeData)
        return dataPromise
    }
    /**
     * auction project update exist
     *  @param {object} req request data
     * @returns {object} sql response
     */
    static async auctionProjectUpdateexist(req) {
        const mysqli = {}
        let projectId = []
        if (req.body.project_id instanceof Array) {
            projectId = req.body.project_id
        } else {
            projectId = req.body.project_id.split(',')
        }
        const escapeData = [req.body.auction_id, projectId]
        mysqli.keys = ' auctionid=?'
        mysqli.values = ' id IN (?)'
        mysqli.tables = ' projects '
        const strQuery = await mysqclass.mysqli(mysqli, 'update_tables')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * auction project update exist rest
     *  @param {object} req request data
     * @returns {object} sql response
     */
    static async auctionProjectUpdateexistrest(req) {
        const mysqli = {}
        const escapeData = [0, req.body.id]
        mysqli.keys = ' auctionid=?'
        mysqli.values = ' auctionid=?'
        mysqli.tables = ' projects '
        const strQuery = await mysqclass.mysqli(mysqli, 'update_tables')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * auction project update exist rest
     *  @param {object} data data
     *  @param {object} proid data
     *  @param {string} baseTableUsed data
     * @returns {object} sql response
     */
    static async getlotdetails(data, proid, baseTableUsed) {
        const mysqli = {}
        const proId = proid.split(',')
        const escapeData = [proId]
        mysqli.keys = data
        mysqli.values = ' id IN (?) '
        mysqli.tables = baseTableUsed.ext_name
        mysqli.group_by = ''
        mysqli.order_by = ''
        mysqli.limit_by = ''
        const strQuery = await mysqclass.mysqli(mysqli, 'select_tables')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * get Common Invoice no
     *  @param {object} data data
     *  @param {number} proid project id
     *  @param {string} baseTableUsed base table used
     * @returns {object} sql response
     */
    static async getCommonInvoiceNo(data, proid, baseTableUsed) {
        const mysqli = {}
        const escapeData = []
        mysqli.keys = data
        mysqli.values = ' id>0 '
        mysqli.tables = baseTableUsed.ext_name
        mysqli.group_by = ''
        mysqli.order_by = 'order by common_invoice desc'
        mysqli.limit_by = 'limit 1'
        const strQuery = await mysqclass.mysqli(mysqli, 'select_tables')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * get lot carts details
     *  @param {object} data data
     *  @param {number} proid product id
     *  @param {number} userid user id
     *  @param {string} baseTableUsed base table used
     * @returns {object} sql response
     */
    static async getlotcartsdetails(data, proid, userid, baseTableUsed) {
        const mysqli = {}
        const escapeData = [proid, userid]
        mysqli.keys = data
        mysqli.values = ' project_id=? and user_id=? and paid=0'
        mysqli.tables = baseTableUsed.ext_name
        mysqli.group_by = ''
        mysqli.order_by = ''
        mysqli.limit_by = ' limit 1'
        const strQuery = await mysqclass.mysqli(mysqli, 'select_tables')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * get particular table details
     *  @param {object} data data
     *  @param {number} fieldType field taype
     *  @param {number} postID post id
     *  @param {string} baseTableUsed base table used
     * @returns {object} sql response
     */
    static async getparticulartabledetails(data, fieldType, postID, baseTableUsed) {
        const mysqli = {}
        const escapeData = []
        mysqli.keys = data
        mysqli.values = ` ${fieldType}=${postID}`
        mysqli.tables = baseTableUsed
        mysqli.group_by = ''
        mysqli.order_by = ''
        mysqli.limit_by = ''
        const strQuery = await mysqclass.mysqli(mysqli, 'select_tables')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * cart quntity
     *  @param {object} data data
     *  @param {number} fieldType field taype
     *  @param {number} proid product id
     *  @param {string} baseTableUsed base table used
     * @returns {object} sql response
     */
    static async cartqtyproductsub(data, proid) {
        const mysqli = {}
        const proId = proid.split(',')
        const escapeData = [data, proId]
        mysqli.keys = ' booked = booked - ?'
        mysqli.values = ' id IN (?) '
        mysqli.tables = ' projects '
        const strQuery = await mysqclass.mysqli(mysqli, 'update_tables')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * produt status update
     *  @param {object} data data
     *  @param {number} proid product id
     * @returns {object} sql response
     */
    static async productstatusupdate(data, proid) {
        const mysqli = {}
        const proId = proid.split(',')
        const escapeData = [data, proId]
        mysqli.keys = ' market_status = ?'
        mysqli.values = ' id IN (?) '
        mysqli.tables = ' projects '
        const strQuery = await mysqclass.mysqli(mysqli, 'update_tables')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     *cart qty product sold values
     *  @param {object} data data
     *  @param {number} proid product id
     */
    static async cartqtyproductsoldvalue(data, proid) {
        const mysqli = {}
        const proId = proid.split(',')
        const escapeData = [data, proId]
        mysqli.keys = ' sold = sold + ?'
        mysqli.values = ' id IN (?) '
        mysqli.tables = ' projects '
        const strQuery = await mysqclass.mysqli(mysqli, 'update_tables')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     *cart qty product
     *  @param {object} data data
     *  @param {number} proid product id
     */
    static async cartqtyproduct(data, proid) {
        const mysqli = {}
        const proId = proid.split(',')
        const escapeData = [data, proId]
        mysqli.keys = ' booked = booked + ?'
        mysqli.values = ' id IN (?) '
        mysqli.tables = ' projects '
        const strQuery = await mysqclass.mysqli(mysqli, 'update_tables')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     *  update cart buynow
     *  @param {req} req request data
     *  @param {object} data data
     *  @param {number} proid product id
     * @returns {object} sql response
     */
    static async updatecartsbuynow(req, data, baseTableUsed) {
        const mysqli = {}
        let escapeData = []
        const postData = data
        const acceptedObjects = baseTableUsed.array_columns
        const defaultKeys = ['date_added', 'paid_date']
        const defaultValues = [
            dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss'),
            dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss'),
        ]
        const valueInsert = commonSQL.InsertSQLFunction(
            postData,
            acceptedObjects,
            defaultKeys,
            defaultValues,
        )
        mysqli.keys = valueInsert.keys
        escapeData = valueInsert.escapeData
        mysqli.values = valueInsert.values
        mysqli.tables = baseTableUsed.ext_name
        const strQuery = await mysqclass.mysqli(mysqli, 'insert_tables')
        const dataPromise = await global.mysql.query(strQuery, escapeData)
        return dataPromise
    }
    /**
     *  fetch auction by id
     *  @param {number} pid product id
     */
    static async fetchAuctionbyID(pid) {
        const mysql = {}
        const escapeData = [pid]
        const strQuery = await mysqclass.mysqli(mysql, 'get_single_auctions')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     *  update all close dates
     *  @param {string} dateAdded date added
     *  @param {string} dateClosed date closed
     *  @param {number} pid product id
     * @returns {object} sql response
     */
    static async updateAllCloseDates(dateAdded, dateClosed, id) {
        const mysql = {}
        const escapeData = [dateAdded, dateClosed, id]
        const strQuery = await mysqclass.mysqli(mysql, 'update_all_auct_closedate')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     *  get all sub lots new
     *  @param {number} id  id
     * @returns {object} sql response
     */
    static async getAllSubLotsnew(id) {
        const mysql = {}
        const escapeData = [id]
        const strQuery = await mysqclass.mysqli(mysql, 'getAllSubLots')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     *  get all sub lots new
     *  @param {number} id  id
     *  @param {string} date  date
     * @returns {object} sql response
     */
    static async updatelofdetails(id, date) {
        const mysql = {}
        const closeData = commonSQL.dateTimeConvert(date)
        const escapeData = [closeData, id]
        const strQuery = await mysqclass.mysqli(mysql, 'updatelotnew')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     *  get all sub lots new
     *  @param {number} proid  product id
     *  @param {string} baseTableUsed  base table used
     *  @param {number} baseid  base id
     * @returns {object} sql response
     */
    static async commondeleteparenttable(proid, baseTableUsed, baseid) {
        const mysqli = {}
        const proId = proid.split(',')
        const escapeData = [proId]
        mysqli.values = `${baseid} IN (?)`
        mysqli.tables = baseTableUsed.ext_name
        const strQuery = await mysqclass.mysqli(mysqli, 'delete_tables')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     *  get all sub lots new
     *  @param {object} items  items
     *  @param {number} tax  tax
     *  @param {string} address  address
     * @returns {object} sql response
     */
    static async insertAvatax(items, tax, address) {
        const mysqli = {}
        const item = items
        item.amount = item.amount ? item.amount : item.wprice
        const escapeData = [
            0,
            item.project_id ? item.project_id : item.id,
            item.buyer_id ? item.buyer_id : item.user_id,
            item.invoice_address_id ? item.invoice_address_id : address.id,
            (tax / item.amount) * 100,
            tax,
            item.zip ? item.zip : address.zip,
            item.amount ? item.amount : address.amount,
            item.qty,
            0,
        ]
        const strQuery = await mysqclass.mysqli(mysqli, 'third_party_tax_avalara')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     *  insert avatax
     *  @param {object} items  items
     * @returns {object} sql response
     */
    static async getAvatax(item) {
        const mysqli = {}
        const escapeData = [
            item.amount,
            item.project_id ? item.project_id : item.id,
            item.invoice_address_id,
        ]
        const strQuery = await mysqclass.mysqli(mysqli, 'check_third_party_tax_avalara')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     *  update avatax
     *  @param {object} items  items
     * @returns {object} sql response
     */
    static async updateAvatax(item) {
        const mysqli = {}
        const escapeData = [item.id, item.zip, item.amount]
        const strQuery = await mysqclass.mysqli(mysqli, 'update_third_party_tax_avalara')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     *  delete avatax
     *  @param {object} items  items
     * @returns {object} sql response
     */
    static async deleteAvatax(item) {
        const mysqli = {}
        const escapeData = [item.id, item.zip, item.amount]
        const strQuery = await mysqclass.mysqli(mysqli, 'delete_third_party_tax_avalara')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * Search all the dashboard products
     * @param {object} req req object
     * @param {object} data req.body object
     * @param {number} count count for the pagination
     * @returns {object} sql response
     */
    static async ttwSearchDashboardProducts(req, data, count) {
        const actionValue = data.action
        const mysql = {}

        let row = ''
        let where = ''
        let having = ''
        let limitf = ''
        let order = ''
        const dateNow = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')

        let uidc = 0
        if (req.user) {
            uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
        }

        order = ` ORDER BY p.id desc`
        if (req.body.orderby || req.body.order) {
            const sortReturn = commonProduct.sortOrderData(req, where)
            if (sortReturn.order) {
                order = sortReturn.order
            }
            if (sortReturn.where) {
                where += sortReturn.where
            }
        }

        if (req.body.similars) {
            where += commonProduct.similarData(req)
        }
        if (req.body.filters) {
            where += commonProduct.filterData(req)
        }
        if (req.body.having) {
            having += commonProduct.havingData(req)
        }

        if (actionValue !== '') {
            if (
                actionValue === 'auction' ||
                actionValue === 'all' ||
                actionValue === 'winning' ||
                actionValue === 'outbid' ||
                actionValue === 'lost'
            ) {
                row = count === 1 ? 'ttw_dash_auction_item' : 'ttw_dash_auction_item_count'

                if (actionValue === 'winning') {
                    where += ` and p.market_status = "open"`
                    where += ` and p.date_closed >= "${dateNow}" `
                    where += `and (select count(bb.user_id) as latestbiduser_id from ttwbids AS bb where bb.project_id = p.id and bb.active != "0" and bb.user_id in ("${uidc}") order by bb.proposed_amount ) >0`
                } else if (actionValue === 'outbid') {
                    where += ` and p.market_status = "open"`
                    where += ` and p.date_closed >= "${dateNow}" `
                    where += ` and (select count(bb.user_id) as latestbiduser_id from ttwbids AS bb where bb.project_id = p.id and bb.active != "0" and bb.user_id in ("${uidc}") order by bb.proposed_amount ) =0`
                    where += ` and (select count(bb.user_id) as latestbiduser_id from ttwbids AS bb where bb.project_id = p.id and bb.active = "0" and bb.user_id in ("${uidc}") order by bb.proposed_amount ) >0`
                } else if (req.body.is_past_auction) {
                    where += ` `
                } else if (actionValue === 'lost') {
                    where += ` and (p.market_status = "sold")`
                    where += ` and (select count(bb.user_id) as latestbiduser_id from ttwbids AS bb where bb.project_id = p.id and bb.active != "0" and bb.user_id in ("${uidc}") order by bb.proposed_amount ) =0`
                    where += ` and (select count(bb.user_id) as latestbiduser_id from ttwbids AS bb where bb.project_id = p.id and bb.active = "0" and bb.user_id in ("${uidc}") order by bb.proposed_amount ) < 0`
                } else {
                    where += ` and (p.market_status = "open" or p.market_status = "sold")`
                }
            } else if (actionValue === 'watchlist') {
                if (!req.body.is_custom_check)
                    where += ` and p.market_status = "open" and p.date_closed >= "${dateNow}" `
                row = count === 1 ? 'ttw_dash_watchlist_item' : 'ttw_dash_watchlist_item_count'
            } else if (actionValue === 'won') {
                row = count === 1 ? 'dash_won_item' : 'dash_won_item_count'
            }
        }

        const baseTableUsed = global.configColumns.projects
        const customTableUsed = global.configColumns.custom_projects

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

        mysql.customTableJoin = generatedData.customTableJoin
        mysql.columns = generatedData.rowstoFetch
        mysql.mainTable = generatedData.mainTableJoin

        if (actionValue === 'won') {
            const additionalTable = global.configColumns.buynow
            const customAdditionalTable = { enabled: 0 }

            const additionalGeneratedData = commonProduct.additionalTableJoin(
                additionalTable,
                customAdditionalTable,
                baseTableUsed,
                'inner join',
                'project_id',
                'id',
            )
            mysql.customTableJoin = `${mysql.customTableJoin} ${additionalGeneratedData.customTableJoin}`
            mysql.columns = mysql.columns.concat(additionalGeneratedData.rowstoFetch)
        }
        const limitrg = req.body.limit
        const escapeData = []
        if (count === 1) {
            let pagen = (req.body.page - 1) * limitrg
            if (parseInt(pagen, 10) < 0) {
                pagen = 0
            }
            limitf = ` limit ${pagen},${limitrg}`
        }

        mysql.order = order
        mysql.where = where
        mysql.having = having
        mysql.limitf = limitf
        mysql.dateNow = dateNow
        mysql.userid = uidc

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

module.exports.default = productModule