front/modules/invoice.js

/* ============================================================================ *\
|| ########################################################################## ||
|| # Auction Software Marketplace          Release: 0.6   Build 0.7         # ||
|| # ---------------------------------------------------------------------- # ||
|| # License # 35YAHCNR9344X6O666C123AB                                     # ||
|| # ---------------------------------------------------------------------- # ||
|| # Copyright ©2014–2021 Develop Scripts LLC. All Rights Reserved          # ||
|| # This file may not be redistributed in whole or significant part.       # ||
|| # ------------- AUCTION SOFTWARE IS NOT FREE SOFTWARE ------------------ # ||
|| # http://www.auctionsoftwaremarketplace.com|support@auctionsoftware.com  # ||
|| # ---------------------------------------------------------------------- # ||
|| ########################################################################## ||
\* ============================================================================ */

const dateFormat = require('dateformat')
const md5 = require('md5')
const _ = require('underscore')

const mysqclass = require('./mysqli').default
const commonSQL = require('../../common/sql').default
const commonProduct = require('../../common/products').default
const commonFunction = require('../../common/function').default
/**
 * @class class to handle product functions
 */
class invoiceModule {
    /**
     *cart quantity product
     * @param {object} req request object
     * @param {object} data data
     * @param {number} count data
     * @returns {object} sql query
     */
    static async allInvoiceItems(req, data, count) {
        const mysql = {}
        let row = ''
        let where = ''
        const order = ' b.common_invoice desc, b.id asc'
        const dateNow = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')
        where += `and b.common_invoice = ${req.body.invoice_id}`
        row = 'single_invoice_item'
        let uidc = 0
        if (req.user) {
            uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
        }
        const escapeData = [uidc]
        const ordergor = order === '' ? '' : `order by ${order}`

        const baseTableUsed = global.configColumns.buynow
        const customTableUsed = { enabled: 0 }

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

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

        if (typeof global.configFeatures.admin_fee !== 'undefined') {
            if (global.configFeatures.admin_fee.enabled) {
                mysql.columns[0].push('b.admin_fee')
                mysql.columns[0].push('b.admin_fee_percent')
            }
        }

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

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

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

        const strQuery = await mysqclass.mysqli(mysql, row)

        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     *get all transactions
     * @param {number} cartID cart id
     * @returns {object} sql query
     */
    static async getAllTransactions(cartID) {
        const mysql = {}
        const escapeData = [cartID]
        const strQuery = await mysqclass.mysqli(mysql, 'get_cart_invoice_transactions_data')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     *invoice paid user address
     * @param {number} invoiceAddressId data
     * @returns {object} sql query
     */
    static async invoicePaidUserAddress(invoiceAddressId) {
        const mysql = {}
        mysql.where = ''
        const baseTableUsed = global.configColumns.invoice_address
        const customTableUsed = { enabled: 0 }
        const generatedData = commonProduct.generateJoinWithColum(baseTableUsed, customTableUsed, [
            'id',
        ])

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

        const escapeData = [invoiceAddressId]

        const strQuery = await mysqclass.mysqli(mysql, 'get_invoice_paid_user_address')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     *invoice unpaid user address
     * @param {number} invoiceAddressId data
     * @returns {object} sql query
     */
    static async invoiceUnpaidUserAddress(invoiceAddressId) {
        const mysql = {}
        mysql.where = ''
        const baseTableUsed = global.configColumns.user_address_details
        const customTableUsed = { enabled: 0 }
        const generatedData = commonProduct.generateJoinWithColum(baseTableUsed, customTableUsed, [
            'id',
        ])

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

        const escapeData = [invoiceAddressId]

        const strQuery = await mysqclass.mysqli(mysql, 'get_invoice_unpaid_user_address')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     *invoice invoice user address
     * @param {number} invoiceUserId invoice user id
     * @returns {object} sql query
     */
    static async invoiceUser(invoiceUserId) {
        const mysql = {}
        mysql.where = ''
        const baseTableUsed = global.configColumns.users
        const customTableUsed = global.configColumns.custom_users
        const generatedData = commonProduct.generateJoinWithColum(baseTableUsed, customTableUsed, [
            'id',
        ])

        mysql.customTableJoin = generatedData.customTableJoin
        mysql.mainTable = generatedData.mainTableJoin
        mysql.columns = generatedData.rowstoFetch
        const escapeData = [invoiceUserId]
        const strQuery = await mysqclass.mysqli(mysql, 'get_invoice_user')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     *invoice invoice user address
     * @param {number} id id
     * @returns {object} sql query
     */
    static async billingAddress(id) {
        const mysql = {}
        const escapeData = [id]
        const strQuery = await mysqclass.mysqli(mysql, 'get_billing_address_details')
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }

    /**
     * search bid deposits products
     * @param {object} req request
     * @param {object} data data
     * @param {number} count number
     */
    static async searchBidDepositsProducts(req, data, count) {
        const mysql = {}
        let row = ''
        const where = ''
        let limitf = ''
        let uidc = 0
        if (req.user) {
            uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
        }

        row = count === 1 ? 'bid_deposit_all_item' : 'bid_deposit_all_item_cnt'

        const order = ' bdt.id desc'
        const dateNow = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')

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

        const baseTableUsed = global.configColumns.bid_deposit
        const customTableUsed = { enabled: 0 }

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

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

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

        const additionalGeneratedData = commonProduct.additionalTableJoin(
            additionalTable,
            customAdditionalTable,
            baseTableUsed,
            'inner join',
            'id',
            'type_id',
        )

        const additionalTableSecond = global.configColumns.auctionlot
        const customAdditionalTableSecond = { enabled: 0 }

        const additionalGeneratedDataSecond = commonProduct.additionalTableJoin(
            additionalTableSecond,
            customAdditionalTableSecond,
            additionalTable,
            'left join',
            'id',
            'auctionid',
        )

        mysql.customTableJoin = `${mysql.customTableJoin} ${additionalGeneratedData.customTableJoin}`
        mysql.columns = mysql.columns.concat(additionalGeneratedData.rowstoFetch)

        mysql.customTableJoin = `${mysql.customTableJoin} ${additionalGeneratedDataSecond.customTableJoin}`
        mysql.columns = mysql.columns.concat(additionalGeneratedDataSecond.rowstoFetch)

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

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

        const strQuery = await mysqclass.mysqli(mysql, row)
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * search invoice products
     * @param {object} req request
     * @param {object} data data
     * @param {number} count number
     */
    static async searchInvoiceProducts(req, data, count) {
        const mysql = {}
        let row = ''
        let where = ''
        let limitf = ''
        let uidc = 0
        if (req.user) {
            uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
        }

        const actionValue = data.action
        if (!actionValue || actionValue === '' || actionValue === 'all') {
            where += `and (b.partial = 1 or b.paid = 1)`
        } else if (actionValue === 'unpaid') {
            where += `and b.paid = 0 and b.partial = 0`
        } else if (actionValue === 'draft' || actionValue === 'partial') {
            where += `and b.paid = 0 and b.partial = 1`
        } else if (actionValue === 'paid') {
            where += `and b.paid = 1 and b.partial = 0`
        } else if (actionValue === 'allinv') {
            where += ``
        }

        row = count === 1 ? 'invoice_all_item' : 'invoice_all_item_cnt'

        const order = ' b.common_invoice desc'
        const dateNow = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')

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

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

        const baseTableUsed = global.configColumns.buynow
        const customTableUsed = { enabled: 0 }

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

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

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

        const additionalGeneratedData = commonProduct.additionalTableJoin(
            additionalTable,
            customAdditionalTable,
            baseTableUsed,
            'inner join',
            'id',
            'project_id',
        )

        const additionalTableSecond = global.configColumns.auctionlot
        const customAdditionalTableSecond = { enabled: 0 }

        const additionalGeneratedDataSecond = commonProduct.additionalTableJoin(
            additionalTableSecond,
            customAdditionalTableSecond,
            additionalTable,
            'left join',
            'id',
            'auctionid',
        )

        mysql.customTableJoin = `${mysql.customTableJoin} ${additionalGeneratedData.customTableJoin}`
        mysql.columns = mysql.columns.concat(additionalGeneratedData.rowstoFetch)

        mysql.customTableJoin = `${mysql.customTableJoin} ${additionalGeneratedDataSecond.customTableJoin}`
        mysql.columns = mysql.columns.concat(additionalGeneratedDataSecond.rowstoFetch)

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

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

        const strQuery = await mysqclass.mysqli(mysql, row)
        const dataReturn = await global.mysql.query(strQuery, escapeData)
        return dataReturn
    }
    /**
     * search transaction
     * @param {object} req request
     * @param {object} data data
     * @param {number} count number
     */
    static async searchTransaction(req, data, count) {
        const mysql = {}
        let row = ''
        const where = ''
        let limitf = ''
        let uidc = 0
        if (req.user) {
            uidc = typeof req.user.id === 'undefined' ? 0 : req.user.id
        }

        row = count === 1 ? 'transactions_all_item' : 'transactions_all_item_cnt'

        const order = ' b.common_invoice desc'
        const dateNow = dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss')

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

        const baseTableUsed = global.configColumns.pay_records
        const customTableUsed = { enabled: 0 }

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

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

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

        const additionalGeneratedData = commonProduct.additionalTableJoin(
            additionalTable,
            customAdditionalTable,
            baseTableUsed,
            'inner join',
            'common_invoice',
            'cart_id',
        )

        mysql.customTableJoin = `${mysql.customTableJoin} ${additionalGeneratedData.customTableJoin}`
        mysql.columns = mysql.columns.concat(additionalGeneratedData.rowstoFetch)

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

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

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

module.exports.default = invoiceModule