/* ============================================================================ *\
|| ########################################################################## ||
|| # 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 commonSQL = require('../../common/sql').default
const mysqclass = require('./mysqli').default
const commonProduct = require('../../common/products').default
/**
* @class class to handle cart functions
*/
class buynowModule {
/**
* get lot cart details
* @param {object} data data
* @param {object} escapeValue escape values
* @param {object} FilterValue filtervalues
* @param {string} baseTableUsed basetableused
* @param {number} limit limit
* @param {string} groupBy group by
* @param {string} orderBy order by
* @returns {object} sql query
*/
static async getlotcartsdetails(
data,
escapeValue,
FilterValue,
baseTableUsed,
limit,
groupBy,
orderBy,
) {
const mysqli = {}
const escapeData = escapeValue
mysqli.keys = data
mysqli.values = FilterValue
mysqli.tables = baseTableUsed
mysqli.group_by = groupBy || ''
mysqli.order_by = orderBy || ''
if (limit > 0) {
mysqli.limit_by = ` limit ${limit}`
} else {
mysqli.limit_by = ''
}
const strQuery = await mysqclass.mysqli(mysqli, 'select_tables')
const dataReturn = await global.mysql.query(strQuery, escapeData)
return dataReturn
}
/**
* get buy now project details
* @param {object} req request object
* @returns {object} sql query
*/
static async getBuynowProjectDetails(req) {
const mysqli = {}
const escapeData = [req.body.product_id.toString().split(',')]
mysqli.tables = global.configColumns.projects.ext_name
const strQuery = await mysqclass.mysqli(mysqli, 'get_project_details_buynow')
const dataReturn = await global.mysql.query(strQuery, escapeData)
return dataReturn
}
/**
* get buy now cart Details
* @param {object} req request object
* @param {object} prdt product details
* @returns {object} sql query
*/
static async getBuyNowCartDetails(req, prdt) {
const mysqli = {}
const escapeData = [prdt.id, req.body.user_id]
mysqli.tables = global.configColumns.cart_temp.ext_name
const strQuery = await mysqclass.mysqli(mysqli, 'get_cart_details_buynow')
const dataReturn = await global.mysql.query(strQuery, escapeData)
return dataReturn
}
/**
* get common invoice no
* @param {object} data data
* @param {string} baseTableUsed base table used
* @returns {object} sql query
*/
static async getCommonInvoiceNo(data, baseTableUsed) {
const mysqli = {}
const escapeData = []
mysqli.keys = data
mysqli.values = ' id>0 '
mysqli.tables = baseTableUsed
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 cart quantity prduct sold values
* @param {object} data data
* @param {number} proid product id
* @returns {object} sql query
*/
static async cartqtyproductsoldvalue(data, proid) {
const mysqli = {}
const proId = proid.toString().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
}
/**
* update cart buy now
* @param {object} req request object
* @param {object} data data
* @param {string} baseTableUsed base table used
* @returns {object} sql query
*/
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
}
/**
*
* @param {object} req request object
* @param {object} data data
* @param {number} proid product id
* @param {number} typeoffield type of filed
* @param {string } baseTableUsed base table used
* @returns {object} sql query
*/
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
}
/**
*get carts details
* @param {object} data data
* @param {number} userID number
* @param {number} sellID seller id
* @param {string} baseTableUsed base table used
* @param {string} baseTableUsed2 second base table used
* @returns {object} sql query
*/
static async getcartsdetails(data, userID, sellID, baseTableUsed, baseTableUsed2) {
const mysqli = {}
let escapeData = []
if (sellID === 0) {
escapeData = [userID]
mysqli.values = ' c.user_id IN (?) '
} else {
escapeData = [userID, sellID]
mysqli.values = ' c.user_id IN (?) and c.seller_id (?) '
}
mysqli.keys = data
mysqli.tables = `${baseTableUsed} as p inner join ${baseTableUsed2} as c on (p.id=c.project_id)`
mysqli.group_by = ''
mysqli.order_by = ' order by c.cart_id desc'
mysqli.limit_by = ''
const strQuery = await mysqclass.mysqli(mysqli, 'select_tables')
const dataReturn = await global.mysql.query(strQuery, escapeData)
return dataReturn
}
/**
*cart quantity product
* @param {object} data data
* @param {number} proid product id
* @returns {object} sql query
*
*/
static async cartqtyproductsub(data, proid) {
const mysqli = {}
const proId = proid.toString().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
}
/**
*cart table quantity update
* @param {number} userid user id
* @param {number} cartid cart id
* @param {number} proid project id
* @returns {object} sql query
*/
static async cartTableqtyUpdate(cartid, userid, proid) {
const mysqli = {}
const userId = userid.toString().split(',')
const cartId = cartid.toString().split(',')
const proId = proid.toString().split(',')
const dateUpdate = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
const escapeData = [dateUpdate, cartId, userId, proId]
mysqli.keys = ' paid = 1,updated_at=? '
mysqli.values = ' cart_id IN (?) and user_id IN (?) and project_id IN (?) '
mysqli.tables = ' cart_temp '
const strQuery = await mysqclass.mysqli(mysqli, 'update_tables')
const dataReturn = await global.mysql.query(strQuery, escapeData)
return dataReturn
}
/**
* buynow invoice update
* @param {object} req request object
* @param {number} buynowID buynow id
* @param {number} userid user id
* @returns {object} sql query
*/
static async buynowinvoiceUpdate(req, buynowID, userid) {
const mysqli = {}
const userId = userid.toString().split(',')
const dateUpdate = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
const escapeData = [
req.body.common_invoice,
req.body.payment_method,
req.body.paid,
dateUpdate,
req.body.total_invoice,
req.body.total_due_amount,
req.body.appointment_id,
userId,
buynowID.toString().split(','),
]
mysqli.keys =
'common_invoice =?, payment_method = ?, paid = ?,active=1,partial=0,paid_date=?,total_invoice=?,paid_amount =?,appointment_id=? '
mysqli.values = ' user_id = ? and id IN (?)'
mysqli.tables = ' buynow '
const strQuery = await mysqclass.mysqli(mysqli, 'update_tables')
const dataReturn = await global.mysql.query(strQuery, escapeData)
return dataReturn
}
/**
* buy now invoice partial update
* @param {object} req request object
* @param {number} buynowID buynow id
* @param {number} userid user id
* @returns {object} sql query
*/
static async buynowinvoicePartialUpdate(req, buynowID, userid) {
const mysqli = {}
const userId = userid.toString().split(',')
const dateUpdate = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
const escapeData = [
req.body.common_invoice,
req.body.payment_method,
req.body.paid,
req.body.total_invoice,
req.body.total_due_amount,
req.body.appointment_id,
userId,
buynowID.toString().split(','),
]
mysqli.keys =
'common_invoice =?, payment_method = ?, paid = ?,partial=1,total_invoice=?,paid_amount = ?,appointment_id=? '
mysqli.values = ' user_id = ? and id IN (?)'
mysqli.tables = ' buynow '
const strQuery = await mysqclass.mysqli(mysqli, 'update_tables')
const dataReturn = await global.mysql.query(strQuery, escapeData)
return dataReturn
}
/**
* common delete parent table
* @param {number} proid product id
* @param {number} baseid base id
* @param {string} baseTableUsed base table used
* @returns {object} sql query
*/
static async commondeleteparenttable(proid, baseid, baseTableUsed) {
const mysqli = {}
const proId = proid.toString().split(',')
const escapeData = [proId]
mysqli.values = `${baseid} IN (?)`
mysqli.tables = baseTableUsed
const strQuery = await mysqclass.mysqli(mysqli, 'delete_tables')
const dataReturn = await global.mysql.query(strQuery, escapeData)
return dataReturn
}
/**
* remove sold temp cart
* @param {number} proid product id
* @returns {object} sql query
*/
static async removeSoldTempCart(proid) {
const mysqli = {}
const proId = proid.toString().split(',')
const escapeData = [proId]
mysqli.values = ' project_id IN (?) and paid = 0 '
mysqli.tables = ' cart_temp '
const strQuery = await mysqclass.mysqli(mysqli, 'delete_tables')
const dataReturn = await global.mysql.query(strQuery, escapeData)
return dataReturn
}
/**
* product status udpate
* @param {object} data data
* @param {number} proid product id
* @returns {object} sql query
*/
static async productstatusupdate(data, proid) {
const mysqli = {}
const proId = proid.toString().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
}
/** update cart details
*
* @param {object} req request object
* @param {number} qty quantity
* @param {number} proid product id
* @param {number} uid user id
* @param {number} price price
* @returns {object} sql query
*/
static async updatecartdetails(req, qty, proid, uid, price) {
const mysqli = {}
const escapeData = [qty, price, proid, uid]
const strQuery = await mysqclass.mysqli(mysqli, 'update_custom_cart')
const dataReturn = await global.mysql.query(strQuery, escapeData)
return dataReturn
}
/**
* insert user cart details
* @param {object} req request object
* @param {number} qty quantity
* @param {number} proid product id
* @param {number} uid user id
* @param {number} price price
* @returns {object} sql query
*/
static async insertucartdetails(req, qty, proid, uid, price) {
const mysqli = {}
const dateNow = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
const escapeData = [proid, dateNow, qty, 0, uid, price]
const strQuery = await mysqclass.mysqli(mysqli, 'insert_custom_cart')
const dataReturn = await global.mysql.query(strQuery, escapeData)
return dataReturn
}
/**
* update cart data
* @param {object} data obejct data
* @param {number} proid product id
* @param {number} uid user id
* @returns {object} sql query
*/
static async updateCartData(data, proid, uid) {
let postData = data
const mysqli = {}
const acceptedObjects = [
'per_total',
'total_amount',
'tax_percent',
'total_tax',
'shipping_percent',
'total_shipping',
'buyer_premium_percent',
'total_premium',
'cart_group',
'delivery_type',
]
postData = _.omit(postData, (value, key) => {
if (
_.isNull(value) ||
_.isUndefined(value) ||
value === '' ||
!_.contains(acceptedObjects, key)
) {
return true
}
return false
})
let escapeData = []
const defaultKeys = ['updated_at']
const defaultValues = [dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')]
const keyswithescape = defaultKeys.concat(_.keys(postData))
escapeData = defaultValues.concat(_.values(postData))
mysqli.keys = _.map(keyswithescape, (val) => {
return `${val} = ?`
})
mysqli.pro_id = proid
mysqli.u_id = uid
const strQuery = await mysqclass.mysqli(mysqli, 'update_cart_detailsnew')
const dataPromise = await global.mysql.query(strQuery, escapeData)
return dataPromise
}
/**
* update buy now data
* @param {object} data data
* @param {number} proid projet id
* @param {number} uid user id
* @returns {object} sql query
*/
static async updateBuyNowData(data, proid, uid) {
let postData = data
const mysqli = {}
const acceptedObjects = [
'per_total',
'total_amount',
'tax_percent',
'total_tax',
'shipping_percent',
'total_shipping',
'buyer_premium_percent',
'total_premium',
'cart_group',
'delivery_type',
]
postData = _.omit(postData, (value, key) => {
if (
_.isNull(value) ||
_.isUndefined(value) ||
value === '' ||
!_.contains(acceptedObjects, key)
) {
return true
}
return false
})
let escapeData = []
const defaultKeys = []
const defaultValues = []
const keyswithescape = defaultKeys.concat(_.keys(postData))
escapeData = defaultValues.concat(_.values(postData))
mysqli.keys = _.map(keyswithescape, (val) => {
return `${val} = ?`
})
mysqli.pro_id = proid
mysqli.u_id = uid
const strQuery = await mysqclass.mysqli(mysqli, 'update_buynow_detailsnew')
const dataPromise = await global.mysql.query(strQuery, escapeData)
return dataPromise
}
/**
* update cart data user
* @param {object} data data
* @param {number} uid user id
* @returns {object} sql query
*/
static async updateCartDataUser(data, uid) {
let postData = data
const mysqli = {}
const acceptedObjects = ['total_amount', 'total_tax', 'total_shipping', 'total_premium']
postData = _.omit(postData, (value, key) => {
if (
_.isNull(value) ||
_.isUndefined(value) ||
value === '' ||
!_.contains(acceptedObjects, key)
) {
return true
}
return false
})
let escapeData = []
const defaultKeys = ['updated_at']
const defaultValues = [dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')]
const keyswithescape = defaultKeys.concat(_.keys(postData))
escapeData = defaultValues.concat(_.values(postData))
mysqli.keys = _.map(keyswithescape, (val) => {
return `${val} = ?`
})
mysqli.u_id = uid
const strQuery = await mysqclass.mysqli(mysqli, 'update_cart_detailsuser')
const dataPromise = await global.mysql.query(strQuery, escapeData)
return dataPromise
}
/**
*cart qty product
* @param {object} data data
* @param {number} proid project id
* @returns {object} sql query
*/
static async cartqtyproduct(data, proid) {
const mysqli = {}
const proId = proid.toString().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
}
/**
*cart Timer
* @param {number} cartid cart id
* @returns {object} sql query
*/
static async cartTimer(cartid) {
const mysqli = {}
const timer = global.configurations.variables.cart_timer || 0
const escapeData = [
dateFormat(new Date(new Date().getTime() + timer * 1000), 'yyyy-mm-dd HH:MM:ss'),
cartid,
]
mysqli.keys = ' date_end = ?'
mysqli.values = ' cart_id IN (?) '
mysqli.tables = ' cart_temp '
const strQuery = await mysqclass.mysqli(mysqli, 'update_tables')
const dataReturn = await global.mysql.query(strQuery, escapeData)
return dataReturn
}
/**
*cart Timer update
* @param {number} uid user id
* @returns {object} sql query
*/
static async cartTimerUpdate(uid) {
const mysqli = {}
const timer = global.configurations.variables.cart_timer || 0
const escapeData = [
dateFormat(new Date(new Date().getTime() + timer * 1000), 'yyyy-mm-dd HH:MM:ss'),
uid,
]
mysqli.keys = ' date_end = ?'
mysqli.values = ` user_id = ? and paid = 0 and date_end IS NOT NULL`
mysqli.tables = ' cart_temp '
const strQuery = await mysqclass.mysqli(mysqli, 'update_tables')
const dataReturn = await global.mysql.query(strQuery, escapeData)
return dataReturn
}
/**
* get all temp cart group
* @param {object} req request object
* @returns {object} sql query
*/
static async getAllTempCartsGroups(req) {
let mysql = ''
let row = ''
let where = ''
const order = 'crt.cart_id asc'
where += ``
row = 'temp_cart_all_cartid'
let uidc = 0
if (req.user) {
uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
}
const escapeData = [uidc]
const ordergor = order === '' ? '' : `order by ${order}`
mysql = {
where,
order: ordergor,
userid: uidc,
}
const strQuery = await mysqclass.mysqli(mysql, row)
const dataReturn = await global.mysql.query(strQuery, escapeData)
return dataReturn
}
/**
*
* @param {object} req request object
* @param {object} data data
* @param {number} count count
* @returns {object} sql query
*/
static async allCartItems(req, data, count) {
const baseTableUsed = global.configColumns.cart_temp
const customTableUsed = { enabled: 0 }
const mysql = {}
let row = ''
let where = ''
let subquery = ''
const order = 'crt.cart_id asc'
const dateNow = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
if (req.body.group_id) {
where +=
count === 1
? `and crt.cart_group = ${req.body.group_id}`
: ' and crt.cart_group = 0'
} else if (req.body.cart_id) {
where +=
count === 1 ? `and crt.cart_id IN (${req.body.cart_id})` : ' and crt.cart_group = 0'
}
const generatedData = commonProduct.generateJoinWithColum(baseTableUsed, customTableUsed, [
'id',
])
row = 'temp_cart_all_item'
let uidc = 0
if (req.body.user_id) {
uidc = req.body.user_id
}
if (req.user && uidc === 0) {
uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
}
const escapeData = [uidc]
const ordergor = order === '' ? '' : `order by ${order}`
mysql.customTableJoin = generatedData.customTableJoin
mysql.columns = generatedData.rowstoFetch
const additionalTable = global.configColumns.projects
const customAdditionalTable = global.configColumns.custom_projects
const additionalGeneratedData = commonProduct.additionalTableJoin(
additionalTable,
customAdditionalTable,
baseTableUsed,
'left join',
'id',
'project_id',
)
mysql.customTableJoin = `${mysql.customTableJoin} ${additionalGeneratedData.customTableJoin}`
mysql.columns = mysql.columns.concat(additionalGeneratedData.rowstoFetch)
if (global.configFeatures.ttw_bidding && global.configFeatures.ttw_bidding.enabled) {
subquery += ` ,if(it.public_start_date < "${dateNow}",1,0) isPublic `
subquery += ` ,(select coalesce(sum(Case when ttw.update_proposed_amount = 0 then ttw.proposed_amount else ttw.update_proposed_amount end),0) as ttwQty from ttwbids as ttw where ttw.project_id = it.ttw_offer_project_id and ttw.user_id = ${uidc}) as ttwQty`
subquery += ` ,(select coalesce(sum(bb.qty),0) from buynow as bb where bb.project_id = p.id and bb.user_id = ${uidc}) as ttwSold`
}
mysql.where = where
mysql.order = ordergor
mysql.dateNow = dateNow
mysql.userid = uidc
mysql.subquery = subquery
const strQuery = await mysqclass.mysqli(mysql, row)
const dataReturn = await global.mysql.query(strQuery, escapeData)
return dataReturn
}
/**
*
* @param {number} buynowID buynow id
* @param {number} userId user id
* @param {string} type type
* @returns {object} sql query
*/
static async updateAddress(buynowID, userId, type) {
const mysql = {}
const escapeData = [type, userId]
const strQuery = await mysqclass.mysqli(mysql, 'insert_in_invoice_address')
const dataReturn = await global.mysqlsingle.query(strQuery, escapeData)
if (typeof dataReturn.insertId !== 'undefined') {
const mysql1 = {}
const escapeData1 = [dataReturn.insertId, buynowID.toString().split(','), userId]
const strQuery1 = await mysqclass.mysqli(mysql1, 'update_invoice_address')
const dataReturn1 = await global.mysqlsingle.query(strQuery1, escapeData1)
return dataReturn1
}
return ''
}
/**
*update Admin fee
* @param {object} req request object
* @returns {object} sql query
* @returns {object} sql query
*/
static async updateAdminFee(req) {
const mysql = {}
const escapeData = [
parseFloat(req.body.admin_fee_percent).toFixed(2),
parseFloat(req.body.admin_fee).toFixed(2),
req.body.common_invoice,
req.body.user_id,
]
const strQuery = await mysqclass.mysqli(mysql, 'update_adminfee')
const dataReturn = await global.mysqlsingle.query(strQuery, escapeData)
return dataReturn
}
static async extendCartTimer(req) {
const mysqli = {}
const timer = 600
const escapeData = [
dateFormat(new Date(new Date().getTime() + timer * 1000), 'yyyy-mm-dd HH:MM:ss'),
req.body.user_id,
]
mysqli.keys = ' date_end = ?'
mysqli.values = ' user_id IN (?) and date_end IS NOT NULL '
mysqli.tables = ' cart_temp '
const strQuery = await mysqclass.mysqli(mysqli, 'update_tables')
const dataReturn = await global.mysql.query(strQuery, escapeData)
return dataReturn
}
}
module.exports.default = buynowModule