front/controllers/bid/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  # ||
|| # ---------------------------------------------------------------------- # ||
|| ########################################################################## ||
\* ============================================================================ */

const asyncNPM = require('async')
const dateFormat = require('dateformat')

const bidModule = require('../../modules/bid').default
const sendgridModule = require('../../../common/thirdparty/sendgrid').default
const twilioModule = require('../../../common/thirdparty/twilio').default
const commonFunction = require('../../../common/function').default
const schemaModule = require('./schema').default
const { jsonResponse } = require('../logger')

module.exports = {
    /**
     * Confirm bid
     *
     * @memberOf frontend.bid
     * @param {object} req request object
     * @param {object} res response object
     */
    bidConfirm: async (req, res) => {
        try {
            global.bid_increment = 10
            const finalresults = {}
            req.session[`${req.body.id}proxybid${req.user.id}`] = req.body.id
            req.body.bid_increment = global.bid_increment
            let bidtopstatus = ''
            // let secondhuname = 'Guest';
            let firsthuname = 'Guest'
            let cuserRealtimeNextbid = 0
            let cuserRealtimeIncerment = 0

            let biddingType = 'hard'
            if (
                req.body.bidding_type &&
                (req.body.bidding_type === 'hard' || req.body.bidding_type === 'proxy')
            ) {
                biddingType = req.body.bidding_type
            }

            // global.general.proxy_bidding = 1;
            if (
                typeof req.body.wsprice === 'undefined' ||
                req.body.wsprice === '' ||
                Number.isNaN(req.body.wsprice) ||
                (typeof req.body.wsprice !== 'number' && req.body.wsprice % 1 !== 0)
            ) {
                finalresults.bpop_cbidder = req.user.id
                finalresults.id = req.body.id
                finalresults.status = 'failed'
                finalresults.error = 'Bid amount is not a valid one'
                req.session[`${req.body.id}proxybid${req.user.id}`] = null
                global.io.sockets.emit('bidAddtime', finalresults)
                res.end()
            }
            req.body.logstdate = new Date()
            res.send('ok')
            req.body.belowFiveAuction = 0
            req.body.auctionid = 0
            req.body.first_bidder = false
            req.body.first_bidder_amount = req.body.wsprice
            req.body.bid_pos = 1
            let isdupiuser = 0
            const results = await Promise.all([bidModule.bidProductDetail(req.body.id)])
            const prdt = results[0][0]
            if (prdt.auctionid) {
                req.body.auctionid = prdt.auctionid
            }
            asyncNPM.waterfall(
                [
                    (callback) => {
                        global.mysqlsingle.beginTransaction(async () => {
                            try {
                                req.body.starting_price = prdt.wprice
                                req.body.title = prdt.title
                                req.body.spc_startp = prdt.sprice
                                if (req.body.wsprice < prdt.wprice) {
                                    finalresults.bpop_cbidder = req.user.id
                                    finalresults.id =
                                        req.session[`${req.body.id}proxybid${req.user.id}`]
                                    finalresults.status = 'failed'
                                    finalresults.error = 'Please submit higher bid'
                                    req.session[`${req.body.id}proxybid${req.user.id}`] = null
                                    global.io.sockets.emit('bidAddtime', finalresults)
                                    res.end()
                                } else {
                                    const datenow = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
                                    const closeddate = dateFormat(
                                        new Date(prdt.date_closed),
                                        'yyyy-mm-dd HH:MM:ss',
                                    )
                                    const datenowas = new Date()
                                    const closeddateas = new Date(prdt.date_closed)
                                    const diffMs = closeddateas.getTime() - datenowas.getTime()
                                    // const diffMins = Math.floor((diffMs / 1000 / 60) % 60)
                                    if (closeddate <= datenow && prdt.market_status === 'open') {
                                        finalresults.bpop_cbidder = req.user.id
                                        finalresults.id =
                                            req.session[`${req.body.id}proxybid${req.user.id}`]
                                        finalresults.status = 'failed'
                                        finalresults.error = 'item_was_closed'
                                        req.session[`${req.body.id}proxybid${req.user.id}`] = null
                                        global.io.sockets.emit('bidAddtime', finalresults)
                                        res.end()
                                    } else if (prdt.market_status !== 'open') {
                                        finalresults.bpop_cbidder = req.user.id
                                        finalresults.id =
                                            req.session[`${req.body.id}proxybid${req.user.id}`]
                                        finalresults.status = 'failed'
                                        finalresults.error = 'item_was_closed'
                                        req.session[`${req.body.id}proxybid${req.user.id}`] = null
                                        global.io.sockets.emit('bidAddtime', finalresults)
                                        res.end()
                                    } else if (
                                        typeof global.configurations.variables.bidding_extended !==
                                        'undefined'
                                    ) {
                                        if (
                                            typeof global.configurations.variables.ext_min_limit !==
                                                'undefined' &&
                                            typeof global.configurations.variables
                                                .max_next_limit !== 'undefined'
                                        ) {
                                            const extMinLimit = parseInt(
                                                global.configurations.variables.ext_min_limit *
                                                    60000,
                                                10,
                                            )
                                            const extNextLimit = parseInt(
                                                global.configurations.variables.bidding_extended,
                                                10,
                                            )
                                            const maxNextLimit = parseInt(
                                                global.configurations.variables.max_next_limit,
                                                10,
                                            )
                                            if (
                                                parseInt(diffMs, 10) < parseInt(extMinLimit, 10) &&
                                                parseInt(prdt.autobid_count, 10) <
                                                    parseInt(maxNextLimit, 10)
                                            ) {
                                                const newdt = new Date(prdt.date_closed)
                                                const minutesaddition =
                                                    parseInt(extNextLimit, 10) * 60000
                                                // newdt.setMinutes(newdt.getMinutes() + extNextLimit);
                                                req.body.belowFiveIncrement = new Date(
                                                    newdt.getTime() + minutesaddition,
                                                )
                                                req.body.belowFive = 1

                                                await Promise.all([
                                                    bidModule.updateCloseDate(req),
                                                    bidModule.updateAutoBidCount(req),
                                                ])

                                                if (
                                                    typeof global.configFeatures
                                                        .auction_extend_timer !== 'undefined'
                                                ) {
                                                    if (
                                                        parseInt(
                                                            global.configFeatures
                                                                .auction_extend_timer.enabled,
                                                            10,
                                                        ) === 1 &&
                                                        prdt.auctionid
                                                    ) {
                                                        const [auctionDetails] = await Promise.all([
                                                            bidModule.getCloseDateAuction(prdt),
                                                        ])
                                                        if (auctionDetails[0].date_closed) {
                                                            if (
                                                                req.body.belowFiveIncrement >
                                                                new Date(
                                                                    auctionDetails[0].date_closed,
                                                                )
                                                            ) {
                                                                req.body.belowFiveAuction = 1

                                                                await Promise.all([
                                                                    bidModule.updateCloseDateAuction(
                                                                        req,
                                                                        prdt,
                                                                    ),
                                                                ])
                                                            }
                                                        }
                                                    }
                                                }

                                                // notification for bidding extended time
                                                if (
                                                    typeof global.configFeatures
                                                        .bidding_extended_trigger !== 'undefined' &&
                                                    prdt.autobid_count === 0
                                                ) {
                                                    if (
                                                        parseInt(
                                                            global.configFeatures
                                                                .bidding_extended_trigger.enabled,
                                                            10,
                                                        ) === 1
                                                    ) {
                                                        req.body.refer_id = prdt.id
                                                        req.body.refer_field =
                                                            global.configFeatures.bidding_extended_trigger.cat_name
                                                        req.body.type = 'bidding_extended_trigger'
                                                        await Promise.all([
                                                            commonFunction.notifyinsert(req),
                                                        ])
                                                    }
                                                }

                                                global.mysqlsingle.commit(() => {})
                                                callback(null, 'callpass')
                                            } else {
                                                req.body.belowFive = 0
                                                global.mysqlsingle.commit(() => {})
                                                callback(null, 'callpass')
                                            }
                                        } else {
                                            req.body.belowFive = 0
                                            global.mysqlsingle.commit(() => {})
                                            callback(null, 'callpass')
                                        }
                                    } else {
                                        req.body.belowFive = 0
                                        global.mysqlsingle.commit(() => {})
                                        callback(null, 'callpass')
                                    }
                                }
                            } catch (err) {
                                global.mysqlsingle.commit(() => {})
                                callback(err, 'callpass')
                            }
                        })
                    },
                    (callpass, callback) => {
                        req.body.enteramount = req.body.wsprice
                        req.body.proxyuseramt = req.body.wsprice
                        req.body.samehigh = ''
                        global.mysqlsingle.beginTransaction(async () => {
                            try {
                                const proxyUserExist = await Promise.all([
                                    bidModule.checkUserExistInBidProxy(req),
                                    bidModule.getProxyDetails(req, 'get_highest_biduser'),
                                ])
                                req.body.highest_proxy_userid = 0
                                req.body.highest_proxy_amount = 0
                                if (proxyUserExist[1].length > 0) {
                                    req.body.highest_proxy_userid = proxyUserExist[1][0].user_id
                                    req.body.highest_proxy_amount = proxyUserExist[1][0].maxamount
                                }
                                req.body.is_equal = false
                                req.body.bid_type = 'hard_bid'
                                if (
                                    req.user.id !== req.body.highest_proxy_userid &&
                                    parseFloat(req.body.highest_proxy_amount) ===
                                        parseFloat(req.body.wsprice)
                                ) {
                                    const incrementAmount = req.body.bid_increment
                                    // req.body.wsprice = req.body.wsprice - incrementAmount;
                                    req.body.proxyuseramt = req.body.wsprice - incrementAmount
                                    req.body.tied_bidder = 1
                                    req.body.is_equal = true
                                    req.body.bid_type = 'tie_bid'
                                }
                                if (proxyUserExist[0].length > 0) {
                                    const incrementCheck = proxyUserExist[0][0].maxamount
                                    const incrementCheckIncrement = commonFunction.calculateArrayIncrement(
                                        incrementCheck,
                                    )
                                    const incrementCheckNextbid = commonFunction.sumFloat(
                                        incrementCheck,
                                        incrementCheckIncrement,
                                    )
                                    // if (proxyUserExist[0][0].maxamount < req.body.wsprice) {
                                    if (incrementCheckNextbid <= req.body.wsprice) {
                                        try {
                                            await Promise.all([bidModule.updateProxyBid(req)])
                                            req.body.samehigh = 'proxy'
                                            req.body.first_bidder_amount =
                                                proxyUserExist[0][0].maxamount
                                            callback(null, 'callpass')
                                        } catch (err) {
                                            console.log('err', err)
                                            global.mysqlsingle.commit(() => {})
                                            callback(err, 'callpass')
                                        }
                                    } else {
                                        global.mysqlsingle.commit(() => {})
                                        finalresults.bpop_cbidder = req.user.id
                                        finalresults.id =
                                            req.session[`${req.body.id}proxybid${req.user.id}`]
                                        finalresults.status = 'failed'
                                        finalresults.error = 'Cannot bid lower than proxy value'
                                        req.session[`${req.body.id}proxybid${req.user.id}`] = null
                                        global.io.sockets.emit('bidAddtime', finalresults)
                                        res.end()
                                    }
                                } else {
                                    // If user is Not already exist in proxybid table
                                    try {
                                        await Promise.all([bidModule.insertProxyBid(req)])
                                        req.body.first_bidder = true
                                        callback(null, 'callpass')
                                    } catch (err) {
                                        console.log('err', err)
                                        global.mysqlsingle.commit(() => {})
                                        callback(err, 'callpass')
                                    }
                                }
                            } catch (err) {
                                console.log('err', err)
                                global.mysqlsingle.commit(() => {})
                                callback(err, 'callpass')
                            }
                        })
                    },
                    (callpass, callback) => {
                        if (biddingType === 'proxy') {
                            global.mysqlsingle.beginTransaction(async () => {
                                try {
                                    const proxyUserExist1 = await Promise.all([
                                        bidModule.getProxyDetails(req, 'get_highest_biduser'),
                                        bidModule.getProxyDetails(req, 'second_highest_biduser'),
                                        bidModule.fetchLastBid(req),
                                    ])
                                    const latestProxyBidDetails = proxyUserExist1[0][0]
                                    const secondHighestProxyBidDetails = proxyUserExist1[1][0]
                                    const maxieproposeamount =
                                        proxyUserExist1[2].length > 0
                                            ? proxyUserExist1[2][0].proposed_amount
                                            : 0
                                    if (req.body.highest_proxy_userid !== req.user.id) {
                                        req.body.samehigh = 'no_proxy'
                                        const bidDiff =
                                            parseFloat(req.body.wsprice) -
                                            parseFloat(req.body.highest_proxy_amount)
                                        const realBidDiff =
                                            parseFloat(req.body.highest_proxy_amount) -
                                            parseFloat(req.body.wsprice)
                                        req.body.orgwsprice = req.body.wsprice
                                        req.body.current_proxy_highest = false
                                        if (
                                            req.body.highest_proxy_amount > 0 &&
                                            req.body.highest_proxy_amount < req.body.wsprice &&
                                            req.user.id !== req.body.highest_proxy_userid
                                        ) {
                                            let anIncre = req.body.bid_increment
                                            anIncre = commonFunction.calculateArrayIncrement(
                                                req.body.highest_proxy_amount,
                                            )
                                            if (bidDiff >= parseFloat(req.body.bid_increment)) {
                                                req.body.wsprice = bidModule.fetchMinimumBid(
                                                    req.body.highest_proxy_amount,
                                                    anIncre,
                                                )
                                                if (req.body.orgwsprice === req.body.wsprice) {
                                                    req.body.bid_type = 'hard_bid'
                                                } else if (req.body.orgwsprice > req.body.wsprice) {
                                                    req.body.bid_type = 'bid_as_proxy'
                                                } else {
                                                    if (
                                                        req.body.orgwsprice >
                                                            req.body.highest_proxy_amount &&
                                                        req.body.orgwsprice < req.body.wsprice
                                                    ) {
                                                        req.body.wsprice = req.body.orgwsprice
                                                    }
                                                    req.body.bid_type = 'hard_bid'
                                                }
                                            } else {
                                                req.body.bid_type = 'bid_as_proxy'
                                            }
                                            if (
                                                maxieproposeamount !== req.body.highest_proxy_amount
                                            ) {
                                                req.body.second_highest_bid =
                                                    secondHighestProxyBidDetails.maxamount
                                                req.body.second_highest_user_pos =
                                                    secondHighestProxyBidDetails.user_pos
                                                req.body.next_bid = req.body.highest_proxy_amount
                                                bidModule.insertBidsAsProxy(
                                                    req,
                                                    secondHighestProxyBidDetails.user_id,
                                                )
                                            }
                                        } else if (req.body.highest_proxy_amount === 0) {
                                            req.body.bid_increment = bidModule.fetchMinimumBid(
                                                req.body.spc_startp,
                                                req.body.bid_increment,
                                            )
                                            req.body.wsprice = req.body.spc_startp
                                            if (bidDiff >= parseFloat(req.body.bid_increment)) {
                                                req.body.bid_type = 'hard_bid'
                                            }

                                            if (req.body.orgwsprice > req.body.bid_increment) {
                                                req.body.bid_type = 'bid_as_proxy'
                                            }
                                        }

                                        try {
                                            const resbid = await Promise.all([
                                                bidModule.placeBidExtra(req),
                                            ])
                                            req.body.placebid = resbid[0].insertId
                                            const bidDetails = await Promise.all([
                                                bidModule.fetchLastBid(req),
                                            ])
                                            const lastBidDetails = bidDetails[0][0]
                                            if (
                                                lastBidDetails.user_id !==
                                                    latestProxyBidDetails.user_id &&
                                                !req.body.is_equal
                                            ) {
                                                const reamountlatest =
                                                    lastBidDetails.proposed_amount
                                                let orgincrmentafterbid = req.body.bid_increment
                                                orgincrmentafterbid = commonFunction.calculateArrayIncrement(
                                                    reamountlatest,
                                                )

                                                req.body.bid_type = 'bid_as_proxy'
                                                if (
                                                    latestProxyBidDetails.maxamount >
                                                    lastBidDetails.proposed_amount
                                                ) {
                                                    req.body.bid_increment = orgincrmentafterbid
                                                    if (
                                                        bidDiff >=
                                                            parseFloat(req.body.bid_increment) ||
                                                        realBidDiff >=
                                                            parseFloat(req.body.bid_increment)
                                                    ) {
                                                        req.body.next_bid = bidModule.fetchMinimumBid(
                                                            lastBidDetails.proposed_amount,
                                                            orgincrmentafterbid,
                                                        )
                                                    } else {
                                                        req.body.next_bid =
                                                            latestProxyBidDetails.maxamount
                                                    }
                                                    await Promise.all([
                                                        bidModule.insertBidsAsProxy(
                                                            req,
                                                            latestProxyBidDetails.user_id,
                                                        ),
                                                    ])
                                                    req.body.wsprice = req.body.next_bid
                                                    bidModule.updateBid(req)
                                                    global.mysqlsingle.commit(() => {})
                                                    callback(null, 'callpass')
                                                } else if (
                                                    latestProxyBidDetails.maxamount <
                                                    lastBidDetails.proposed_amount
                                                ) {
                                                    await Promise.all([
                                                        bidModule.insertBidsAsProxy(
                                                            req,
                                                            latestProxyBidDetails.user_id,
                                                        ),
                                                    ])
                                                    bidModule.updateBid(req)
                                                    global.mysqlsingle.commit(() => {})
                                                    callback(null, 'callpass')
                                                } else {
                                                    callback(null, 'callpass')
                                                }
                                            } else if (req.body.is_equal) {
                                                req.body.bid_type = 'proxy_leads'
                                                req.body.high_proxy_userid =
                                                    req.body.highest_proxy_userid
                                                await Promise.all([
                                                    bidModule.placeBid(req, 1),
                                                    bidModule.updateBid(req),
                                                ])
                                                global.mysqlsingle.commit(() => {})
                                                callback(null, 'callpass')
                                            } else {
                                                await Promise.all([bidModule.updateBid(req)])
                                                global.mysqlsingle.commit(() => {})
                                                callback(null, 'callpass')
                                            }
                                        } catch (err) {
                                            console.log('err', err)
                                            global.mysqlsingle.commit(() => {})
                                            callback(err, 'callpass')
                                        }
                                    } else {
                                        global.mysqlsingle.commit(() => {})
                                        callback(null, 'callpass')
                                    }
                                } catch (err) {
                                    console.log('err', err)
                                    global.mysqlsingle.commit(() => {})
                                    callback(err, 'callpass')
                                }
                            })
                        } else {
                            global.mysqlsingle.beginTransaction(async () => {
                                try {
                                    const proxyUserExist1 = await Promise.all([
                                        bidModule.getProxyDetails(req, 'get_highest_biduser'),
                                        bidModule.getProxyDetails(req, 'second_highest_biduser'),
                                        bidModule.fetchLastBid(req),
                                    ])
                                    const latestProxyBidDetails = proxyUserExist1[0][0]
                                    const secondHighestProxyBidDetails = proxyUserExist1[1][0]
                                    const maxieproposeamount =
                                        proxyUserExist1[2].length > 0
                                            ? proxyUserExist1[2][0].proposed_amount
                                            : 0
                                    req.body.beforewsprice = req.body.wsprice
                                    if (req.body.highest_proxy_userid !== req.user.id) {
                                        req.body.samehigh = 'no_proxy'
                                        const bidDiff =
                                            parseFloat(req.body.wsprice) -
                                            parseFloat(req.body.highest_proxy_amount)
                                        const realBidDiff =
                                            parseFloat(req.body.highest_proxy_amount) -
                                            parseFloat(req.body.wsprice)
                                        req.body.orgwsprice = req.body.wsprice
                                        req.body.current_proxy_highest = false
                                        if (
                                            req.body.highest_proxy_amount > 0 &&
                                            req.body.highest_proxy_amount < req.body.wsprice &&
                                            req.user.id !== req.body.highest_proxy_userid
                                        ) {
                                            let anIncre = req.body.bid_increment
                                            anIncre = commonFunction.calculateArrayIncrement(
                                                req.body.highest_proxy_amount,
                                            )

                                            if (bidDiff >= parseFloat(req.body.bid_increment)) {
                                                req.body.wsprice = bidModule.fetchMinimumBid(
                                                    req.body.highest_proxy_amount,
                                                    anIncre,
                                                )
                                                if (req.body.orgwsprice === req.body.wsprice) {
                                                    req.body.bid_type = 'hard_bid'
                                                } else if (req.body.orgwsprice > req.body.wsprice) {
                                                    req.body.bid_type = 'hard_bid'
                                                } else {
                                                    if (
                                                        req.body.orgwsprice >
                                                            req.body.highest_proxy_amount &&
                                                        req.body.orgwsprice < req.body.wsprice
                                                    ) {
                                                        req.body.wsprice = req.body.orgwsprice
                                                    }
                                                    req.body.bid_type = 'hard_bid'
                                                }
                                            } else {
                                                req.body.bid_type = 'hard_bid'
                                            }
                                            if (
                                                maxieproposeamount !== req.body.highest_proxy_amount
                                            ) {
                                                req.body.second_highest_bid =
                                                    secondHighestProxyBidDetails.maxamount
                                                req.body.second_highest_user_pos =
                                                    secondHighestProxyBidDetails.user_pos
                                                req.body.next_bid = req.body.highest_proxy_amount
                                                bidModule.insertBidsAsProxy(
                                                    req,
                                                    secondHighestProxyBidDetails.user_id,
                                                )
                                            }
                                        } else if (req.body.highest_proxy_amount === 0) {
                                            req.body.bid_increment = bidModule.fetchMinimumBid(
                                                req.body.spc_startp,
                                                req.body.bid_increment,
                                            )
                                            req.body.wsprice = req.body.spc_startp
                                            if (bidDiff >= parseFloat(req.body.bid_increment)) {
                                                req.body.bid_type = 'hard_bid'
                                            }

                                            if (req.body.orgwsprice > req.body.bid_increment) {
                                                req.body.bid_type = 'hard_bid'
                                            }
                                        }

                                        try {
                                            req.body.wsprice = req.body.beforewsprice
                                            const resbid = await Promise.all([
                                                bidModule.placeBidExtra(req),
                                            ])
                                            req.body.placebid = resbid[0].insertId
                                            const bidDetails = await Promise.all([
                                                bidModule.fetchLastBid(req),
                                            ])
                                            const lastBidDetails = bidDetails[0][0]
                                            if (
                                                lastBidDetails.user_id !==
                                                    latestProxyBidDetails.user_id &&
                                                !req.body.is_equal
                                            ) {
                                                const reamountlatest =
                                                    lastBidDetails.proposed_amount
                                                let orgincrmentafterbid = req.body.bid_increment
                                                orgincrmentafterbid = commonFunction.calculateArrayIncrement(
                                                    reamountlatest,
                                                )

                                                req.body.bid_type = 'bid_as_proxy'
                                                if (
                                                    latestProxyBidDetails.maxamount >
                                                    lastBidDetails.proposed_amount
                                                ) {
                                                    req.body.bid_increment = orgincrmentafterbid
                                                    if (
                                                        bidDiff >=
                                                            parseFloat(req.body.bid_increment) ||
                                                        realBidDiff >=
                                                            parseFloat(req.body.bid_increment)
                                                    ) {
                                                        req.body.next_bid = bidModule.fetchMinimumBid(
                                                            lastBidDetails.proposed_amount,
                                                            orgincrmentafterbid,
                                                        )
                                                    } else {
                                                        req.body.next_bid =
                                                            latestProxyBidDetails.maxamount
                                                    }
                                                    await Promise.all([
                                                        bidModule.insertBidsAsProxy(
                                                            req,
                                                            latestProxyBidDetails.user_id,
                                                        ),
                                                    ])
                                                    req.body.wsprice = req.body.next_bid
                                                    bidModule.updateBid(req)
                                                    global.mysqlsingle.commit(() => {})
                                                    callback(null, 'callpass')
                                                } else if (
                                                    latestProxyBidDetails.maxamount <
                                                    lastBidDetails.proposed_amount
                                                ) {
                                                    await Promise.all([
                                                        bidModule.insertBidsAsProxy(
                                                            req,
                                                            latestProxyBidDetails.user_id,
                                                        ),
                                                    ])
                                                    bidModule.updateBid(req)
                                                    global.mysqlsingle.commit(() => {})
                                                    callback(null, 'callpass')
                                                } else {
                                                    callback(null, 'callpass')
                                                }
                                            } else if (req.body.is_equal) {
                                                req.body.bid_type = 'proxy_leads'
                                                req.body.high_proxy_userid =
                                                    req.body.highest_proxy_userid
                                                await Promise.all([
                                                    bidModule.placeBid(req, 1),
                                                    bidModule.updateBid(req),
                                                ])
                                                global.mysqlsingle.commit(() => {})
                                                callback(null, 'callpass')
                                            } else {
                                                await Promise.all([bidModule.updateBid(req)])
                                                global.mysqlsingle.commit(() => {})
                                                callback(null, 'callpass')
                                            }
                                        } catch (err) {
                                            global.mysqlsingle.commit(() => {})
                                            console.log(err)
                                            callback(err, 'callpass')
                                        }
                                    } else {
                                        req.body.bid_type = 'hard_bid'
                                        req.body.samehigh = 'no_proxy'
                                        try {
                                            await Promise.all([
                                                bidModule.placeBidExtra(req),
                                                bidModule.updateBid(req),
                                            ])
                                            req.body.first_bidder = true
                                            callback(null, 'callpass')
                                        } catch (err) {
                                            console.log('err', err)
                                            global.mysqlsingle.commit(() => {})
                                            callback(err, 'callpass')
                                        }
                                    }
                                } catch (err) {
                                    console.log('err', err)
                                    global.mysqlsingle.commit(() => {})
                                    callback(err, 'callpass')
                                }
                            })
                            // global.mysqlsingle.beginTransaction(async (terr) => {
                            //     req.body.bid_type = 'hard_bid';
                            //     req.body.samehigh = 'no_proxy';
                            //     try {
                            //         await Promise.all([bid.placeBidExtra(req), bid.updateBid(req)]);
                            //         req.body.first_bidder = true;
                            //         callback(null, 'callpass');
                            //     } catch(err) {
                            //         console.log('err', err);
                            //         global.mysqlsingle.commit(function (cerr3) {
                            //         });
                            //         callback(err, 'callpass');
                            //     }
                            // });
                        }
                    },
                    (callpass, callback) => {
                        req.body.userstoomit = []
                        global.mysqlsingle.beginTransaction(async () => {
                            try {
                                const dupecnt = await Promise.all([
                                    bidModule.checkSamountDuplicate(req),
                                ])
                                if (dupecnt[0].length > 0) {
                                    const uploaderFunction = async (url) => {
                                        return new Promise((resolve, reject) => {
                                            if (url.user_id === req.user.id) {
                                                isdupiuser = 1
                                                if (req.body.first_bidder) {
                                                    bidModule.deleteMaxmountDuplicate(
                                                        req,
                                                        url.user_id,
                                                    )
                                                } else {
                                                    bidModule.updateMaxmountDuplicate(
                                                        req,
                                                        url.user_id,
                                                    )
                                                }
                                            }
                                            req.body.userstoomit.push(url.user_id)
                                            bidModule.updateSamountDuplicate(url.id)
                                            bidModule.insertSamountDuplicate(req, url.user_id)
                                            resolve()
                                        })
                                    }
                                    const resultloop = []
                                    dupecnt[0].forEach(async (url, index) => {
                                        const looptoformat = await uploaderFunction(url)
                                        resultloop.push(looptoformat)
                                    })
                                    await Promise.all(resultloop)
                                    global.mysqlsingle.commit(() => {})
                                    callback(null, 'callpass')
                                } else {
                                    global.mysqlsingle.commit(() => {})
                                    callback(null, 'callpass')
                                }
                            } catch (err) {
                                console.log('err', err)
                                global.mysqlsingle.commit(() => {})
                                callback(err, 'callpass')
                            }
                        })
                    },
                ],
                (err, callpass) => {
                    if (err !== null) {
                        console.log('err', err)
                        finalresults.bpop_cbidder = req.user.id
                        finalresults.id = req.session[`${req.body.id}proxybid${req.user.id}`]
                        finalresults.status = 'failed'
                        finalresults.error = 'Please submit higher bid'
                        req.session[`${req.body.id}proxybid${req.user.id}`] = null
                        global.io.sockets.emit('bidAddtime', finalresults)
                        res.end()
                    }
                    if (isdupiuser === 1) {
                        finalresults.bpop_cbidder = req.user.id
                        finalresults.id = req.session[`${req.body.id}proxybid${req.user.id}`]
                        finalresults.status = 'failed'
                        finalresults.dupe_status = req.body.first_bidder
                        finalresults.error = 'Please submit higher bid'
                        req.session[`${req.body.id}proxybid${req.user.id}`] = null
                        global.io.sockets.emit('bidAddtime', finalresults)
                        res.end()
                    }
                    global.mysqlsingle.beginTransaction(async () => {
                        try {
                            bidModule.addUserBidPreference(
                                prdt,
                                req.user.id,
                                req.body.id,
                                req.body.enteramount,
                                'bid',
                            )

                            const bidders = await Promise.all([
                                bidModule.totBidcnt(
                                    req.session[`${req.body.id}proxybid${req.user.id}`],
                                ),
                                commonFunction.checkmailnotify(req, 1),
                                commonFunction.checksmsnotify(req, 1),
                                commonFunction.checkmailnotify(req, 2),
                                commonFunction.checksmsnotify(req, 2),
                                bidModule.proxyNewbidhistory(
                                    req.session[`${req.body.id}proxybid${req.user.id}`],
                                ),
                                bidModule.proxyCheckbidPlaced(
                                    req,
                                    req.session[`${req.body.id}proxybid${req.user.id}`],
                                ),
                                bidModule.proxyGetProxyDetails(
                                    req.session[`${req.body.id}proxybid${req.user.id}`],
                                    'get_highest_biduser',
                                ),
                                bidModule.proxyGetProxyDetails(
                                    req.session[`${req.body.id}proxybid${req.user.id}`],
                                    'second_highest_biduser',
                                ),
                            ])
                            global.mysqlsingle.commit(() => {})
                            isdupiuser = 0
                            const hgerbiduser = bidders[5].length > 0 ? bidders[5][0].user_id : ''
                            const hgerbidcompanyid =
                                bidders[5].length > 0 ? bidders[5][0].companyid : ''
                            const highrbidamt =
                                bidders[5].length > 0
                                    ? bidders[5][0].proposed_amount
                                    : req.body.wsprice
                            const orgorgcuserbamt =
                                bidders[6].length > 0
                                    ? bidders[6][0].proposed_amount
                                    : req.body.wsprice
                            const orgoutcuserbamt =
                                bidders[8].length > 0 ? bidders[8][0].maxamount : req.body.wsprice
                            if (bidders[7][0].user_id === req.user.id) {
                                const cemailEnteramount = req.body.enteramount
                                if (!req.user.username) {
                                    req.user.username = `${req.user.first_name} ${req.user.last_name}`
                                }

                                const orgshtle = commonFunction.shorten(`'${prdt.title}'`, 15)
                                await Promise.all([
                                    commonFunction.eventTriggerFuction(
                                        {
                                            ...req.body,
                                            ...req.user,
                                            product_avatar: `${global.url}/uploads/product/${prdt.avatar}`,
                                            amount: cemailEnteramount,
                                            twoamount: highrbidamt,
                                            smstitle: orgshtle,
                                            date_closed: prdt.date_closed,
                                        },
                                        req.user.email,
                                        req.user.phone,
                                        'bid_submitted',
                                        0,
                                        1,
                                        req.user.id,
                                    ),
                                ])
                            } else {
                                req.body.outbids_ku = 'yes'
                                req.body.first_name = req.session.first_name
                                req.body.last_name = req.session.last_name
                                req.body.toemail = req.session.email
                                req.body.tophone = req.session.phone
                                req.body.toid = req.user.id
                                req.body.pid = req.session[`${req.body.id}proxybid${req.user.id}`]
                                req.body.r_id = Date.parse(new Date()) / 1000
                                req.body.subject = `You've been outbid on ${prdt.title}`
                                req.body.fromid = prdt.user_id
                                req.body.message = `Your maximum bid of $${orgorgcuserbamt} placed on ${prdt.title} has been outbid by another member.`
                                req.body.phmessage = `Your maximum bid of $${orgorgcuserbamt} placed on ${prdt.title} has been outbid by another member.`

                                req.body.to_id = req.body.toid
                                req.body.from_id = req.body.fromid
                                req.body.projectmsgpost = req.body.pid
                                const orgshtle = commonFunction.shorten(`'${prdt.title}'`, 15)

                                await Promise.all([
                                    commonFunction.eventTriggerFuction(
                                        {
                                            ...prdt,
                                            ...req.user,
                                            product_avatar: `${global.url}/uploads/product/${prdt.avatar}`,
                                            currentbidamount: orgorgcuserbamt,
                                            wsprice: highrbidamt,
                                            smstitle: orgshtle,
                                            date_closed: prdt.date_closed,
                                        },
                                        req.user.email,
                                        req.user.phone,
                                        'out_bid',
                                        0,
                                        2,
                                        req.user.id,
                                    ),
                                ])

                                // const resultsNotify = await Promise.all([
                                //     commonFunction.bellNotify(req.user.id, prdt.id, 3),
                                // ])
                                // const realarrresults = {}
                                // realarrresults.id = prdt.id
                                // realarrresults.insertid = resultsNotify[0].insertId
                                // realarrresults.userid = req.user.id
                                // realarrresults.typeid = 3
                                // realarrresults.projtitle = `You have been outbid on ${prdt.title}`
                                // global.io.sockets.emit(
                                //     'notificationupdates',
                                //     realarrresults,
                                // )
                            }

                            const cemailSamehigh = req.body.samehigh
                            if (bidders[8].length > 0 && cemailSamehigh !== 'proxy') {
                                if (bidders[8][0].user_id !== req.user.id) {
                                    req.body.outbids_ku = 'yes'
                                    req.body.first_name =
                                        bidders[8][0].first_name === null
                                            ? ''
                                            : bidders[8][0].first_name
                                    req.body.user_language = bidders[8][0].user_language
                                    req.body.last_name =
                                        bidders[8][0].last_name === null
                                            ? ''
                                            : bidders[8][0].last_name
                                    req.body.toemail = bidders[8][0].email
                                    req.body.email = bidders[8][0].email
                                    req.body.tophone = bidders[8][0].phone
                                    req.body.toid = bidders[8][0].user_id
                                    req.body.pid = bidders[8][0].project_id
                                    req.body.r_id = Date.parse(new Date()) / 1000
                                    req.body.subject = `You've been outbid on ${req.body.title}`
                                    req.body.fromid = prdt.user_id
                                    req.body.message = `Unfortunately, your maximum bid of $${orgoutcuserbamt} placed on ${req.body.title} has been outbid by another member.`
                                    req.body.phmessage = `${req.body.title} has been bidded with higher amount by someone.`

                                    req.body.to_id = req.body.toid
                                    req.body.from_id = req.body.fromid
                                    req.body.projectmsgpost = req.body.pid

                                    const orgshtle = commonFunction.shorten(`'${prdt.title}'`, 15)
                                    await Promise.all([
                                        commonFunction.eventTriggerFuction(
                                            {
                                                ...prdt,
                                                ...req.body,
                                                product_avatar: `${global.url}/uploads/product/${prdt.avatar}`,
                                                currentbidamount: orgorgcuserbamt,
                                                wsprice: highrbidamt,
                                                smstitle: orgshtle,
                                                date_closed: prdt.date_closed,
                                            },
                                            req.body.toemail,
                                            req.body.tophone,
                                            'out_bid_proxy',
                                            0,
                                            2,
                                            bidders[8][0].user_id,
                                        ),
                                    ])
                                }
                            }

                            const realtimeWprice = bidders[5][0].proposed_amount
                            let realtimeIncerment = 0
                            realtimeIncerment = commonFunction.calculateArrayIncrement(
                                realtimeWprice,
                            )

                            let realtimeNextbid = commonFunction.sumFloat(
                                realtimeWprice,
                                realtimeIncerment,
                            )
                            const orgRealtimeNextbid = commonFunction.sumFloat(
                                realtimeWprice,
                                realtimeIncerment,
                            )
                            if (bidders[7].length > 0 && bidders[7][0].user_id === req.user.id) {
                                realtimeNextbid = commonFunction.sumFloat(
                                    bidders[7][0].maxamount,
                                    realtimeIncerment,
                                )
                            }
                            if (bidders[6].length > 0) {
                                const cuserMaxeproxamt = bidders[6][0].maxeprox
                                cuserRealtimeIncerment = commonFunction.calculateArrayIncrement(
                                    cuserMaxeproxamt,
                                )

                                cuserRealtimeNextbid = commonFunction.sumFloat(
                                    cuserMaxeproxamt,
                                    cuserRealtimeIncerment,
                                )
                                if (hgerbiduser !== req.user.id) {
                                    cuserRealtimeNextbid = realtimeNextbid
                                    cuserRealtimeIncerment = realtimeIncerment
                                }
                                // if (bidders[8].length > 0) {
                                //     if (typeof (bidders[8][0].username) === 'undefined') {
                                //         secondhuname =  ''
                                //     } else {
                                //         secondhuname = (bidders[8][0].username === "" || bidders[8][0].username === null) ? "" : bidders[8][0].username;
                                //     }
                                // }
                                if (bidders[7].length > 0) {
                                    if (typeof bidders[7][0].username === 'undefined') {
                                        firsthuname = ''
                                    } else {
                                        firsthuname =
                                            bidders[7][0].username === '' ||
                                            bidders[7][0].username === null
                                                ? ''
                                                : bidders[7][0].username
                                    }
                                }
                                if (bidders[7][0].user_id === req.user.id) {
                                    if (prdt.market_status === 'open') {
                                        if (realtimeWprice < bidders[7][0].maxamount) {
                                            bidtopstatus = 'winner'
                                        } else {
                                            bidtopstatus = 'winner'
                                        }
                                    } else {
                                        bidtopstatus =
                                            prdt.market_status !== 'sold' ? `lost` : `won`
                                    }
                                } else if (prdt.market_status === 'open') {
                                    if (bidders[6][0].proposal === 'tie_bid') {
                                        bidtopstatus = 'outbid'
                                    } else {
                                        bidtopstatus = 'outbid'
                                    }
                                } else {
                                    bidtopstatus = 'outbid'
                                }
                            } else {
                                bidtopstatus = ''
                            }
                            const msbtl = new Date() - req.body.logstdate
                            bidModule.insertBTL(
                                req,
                                req.session[`${req.body.id}proxybid${req.user.id}`],
                                req.user.id,
                                msbtl,
                            )

                            // bidModule.updateScoreBid(
                            //     prdt,
                            //     req,
                            //     realtimeWprice,
                            //     bidders[7][0].maxamount,
                            // )
                            finalresults.id = req.session[`${req.body.id}proxybid${req.user.id}`]
                            finalresults.bpop_wprice = realtimeWprice
                            finalresults.bpop_wprice_morehigh = bidders[7][0].maxamount
                            finalresults.bpop_increment = realtimeIncerment
                            finalresults.bpop_users_to_omit = req.body.userstoomit
                            finalresults.bpop_nextbid = realtimeNextbid
                            finalresults.bpop_nextbid_org = orgRealtimeNextbid
                            finalresults.bpop_cbidder = req.user.id
                            finalresults.bpop_biddersname = firsthuname
                            finalresults.bpop_higher = hgerbiduser
                            finalresults.cuser_enteramount = req.body.enteramount
                            finalresults.bpop_cuser_increment = cuserRealtimeIncerment
                            finalresults.bpop_cuser_nextbid = cuserRealtimeNextbid
                            finalresults.bpop_bidcount = bidders[0][0].bdcnt
                            finalresults.status = 'success'
                            finalresults.bpop_companyid = req.session.companyid
                            finalresults.bpop_highercompanyid = hgerbidcompanyid
                            finalresults.bpop_error = 'bid_placed_successfully'
                            finalresults.error = 'bid_placed_successfully'
                            finalresults.bpop_bidstatus = bidtopstatus
                            finalresults.bpop_belowFive = req.body.belowFive
                            finalresults.bpop_belowFiveIncrement = req.body.belowFiveIncrement
                            finalresults.bpop_belowFiveAuction = req.body.belowFiveAuction
                            finalresults.bpop_auctionid = req.body.auctionid
                            finalresults.bpop_bid_type_user = req.body.bid_type_user
                            req.session[`${req.body.id}proxybid${req.user.id}`] = null
                            global.io.sockets.emit('bidAddtime', finalresults)
                            res.end()
                        } catch (errins) {
                            console.log(errins)
                        }
                    })
                },
            )
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
}