Your IP : 216.73.216.91


Current Path : /var/node/inatote/Inatote-Backend/orders/
Upload File :
Current File : /var/node/inatote/Inatote-Backend/orders/order-list.js

import makeorder from './order.js'
import { UniqueConstraintError } from '../helpers/errors.js';
import calculateDistanceFromLatLong from '../helpers/calculateDistance.js';

export default function makeorderList({ database }) {
    return Object.freeze({
        add,
        findByEmail,
        findById,
        getItems,
        remove,
        replace,
        update,
        findLastOrder,
        configrations,
        validateVoucher,
        updateVoucher,
        singleOrder,
        findOrderByUser,
        findOrderByRider,
        getOrderByVendor,
        calculateRiderCharges
    })

    async function findOrderByUser(userId){
        //console.log("userId" , userId);
        try{
            const db = await database;
            // let orderData = await db
            // .collection('orders')
            // .find({userId : db.makeId(userId)})
            // .toArray()
            // //console.log("order" , orderData );
            let orderData = await db.collection('orders')
            .aggregate([
                {
                    $match : {
                        userId :  db.makeId(userId)
                    }
                },
                {
                    $lookup:
                    {
                        from: "vendors",
                        localField: "vendorId",
                        foreignField: "_id",
                        as: "vendor"
                    }
                },

            ]).toArray();
            return orderData

        }
        catch(err){
            //console.log("err" , err);
        }
    }

    async function getOrderByVendor(userId){
        //console.log("userId" , userId);
        try{
            const db = await database;
            let users = await db.collection("users").findOne({_id:db.makeId(userId)});
            //console.log("users" , users);
            if(users){
            let orderData = await db
            .collection('orders')
            .find({vendorId : db.makeId(users.companyId)})
            .toArray();
            
            return orderData

            }else{
                return []
            }
            
        }
        catch(err){
            //console.log("err" , err);
        }
    }

    async function findOrderByRider(userId , status=null){
        const db = await database;
        let query ={};
       
        try{

            if(userId){
                query = {...query ,riderId : db.makeId(userId)}
            }
            if(status ){
                query = {...query , orderStatus : status}
            }
            //console.log("query" , query);
            
            let orderData = await db
            .collection('orders')
            .find(query)
            .toArray();
            //console.log("order" , orderData );

            return orderData

        }
        catch(err){
            console.log("err" , err);
        }
    }

    async function getItems({ max = 100, before, after, status , cord , riderId } = {}) {
        const db = await database;
        //console.log("status" , typeof status);
        let query = { show: true }
        if (status) {
            
            query = { ...query, orderStatus: {$in : status } }
        }
        if(riderId){
            query = {...query , riderId : db.makeId(riderId)}
        }
        if (before || after) {
            query._id = {}
            query._id = before ? { ...query._id, $lt: db.makeId(before) } : query._id
            query._id = after ? { ...query._id, $gt: db.makeId(after) } : query._id
        }
        //console.log("query" , status);

        let orderData = await db.collection("orders").aggregate([
            {
                $match : query
            },
            {
                $lookup:
                {
                    from: "vendors",
                    localField: "vendorId",
                    foreignField: "_id",
                    as: "vendor"
                }
            },
            {
                $project: {
                    _id: 1, products: 1, totalPrice: 1, deliveryService: 1, serviceFee: 1, tax: 1, subTotal: 1, contactLess: 1,paymentId:1, orderStatus: 1,riderCharges:1,
                    orderHistory: 1, createdDate: 1, lastUpdatedDate: 1, riderCharges:1, riderId:1, riderLat:1, riderLong:1, tip : 1,riderChargesTax: 1, 
                    vendor: { $arrayElemAt: ["$vendor", 0] }, orderNo: 1  , itemsTax : 1 , serviceTax: 1

                }
            }
        ]).toArray();
        // for (let i = 0; i < orderData.length; i++) {
        //   (vendorCord,cord , orderData[i].products.length , orderData[i]);
        //     let ch = await calculateRiderCharges(vendorCord,cord , orderData[i].products.length , orderData[i]);
        //     //console.log("CH" , ch);
        //     orderWithRiderCharges = [...orderWithRiderCharges , {...ch}];
        //     //console.log("orderWithRiderCharges" , orderWithRiderCharges);
            
        // }
        //  orderData.map(async(m)=> {
        //     let vendorCord = {
        //         lat : m.vendor[0].location.coordinates[0],
        //         long : m.vendor[0].location.coordinates[1]
        //     }
        // let ch = await calculateRiderCharges(vendorCord,cord , m.products.length , m);
        //     //console.log("CH" , ch);
        //     orderWithRiderCharges = [...orderWithRiderCharges , {...ch}];
        //     //console.log("orderWithRiderCharges" , orderWithRiderCharges);
        //     return orderWithRiderCharges
        // });
        // let orderData = await db
        //     .collection('orders')
        //     .populate("vendorId")
        //     .find(query)
        //     .limit(Number(max))
        //     .toArray();


        return orderData
    }

    async function calculateRiderCharges(vendorCord , riderCord , itemCount , orderData){
        const db = await database;
        //console.log("orderData" ,orderData );
        try{
            let riderCharges = 0;
            let directionApiResp = await calculateDistanceFromLatLong(vendorCord , riderCord);
            if(directionApiResp){
                console.log("directionApiResp" ,directionApiResp.distance , directionApiResp);
                let configrations = await db
                .collection('configurations')
                .findOne();
                let distInkm = parseInt(directionApiResp.distance.value) / 1000;
                console.log("distInkm" ,distInkm);
                // let riderChargesConf = configrations.forDriver;
                // console.log("conf" ,riderChargesConf);
                // riderCharges = (parseFloat(distInkm) * parseFloat(riderChargesConf.km) ) + parseFloat(riderChargesConf.base) +  ( parseFloat(itemCount) * parseFloat(riderChargesConf.item) );
                // let newOrderData = {...orderData , riderCharges , riderToVendorDist :distInkm }
                let newOrderData = {...orderData  , riderToVendorDist :distInkm }
                
                return newOrderData;

            }
            else {
                return null
            }
            
        }
        catch(err){
            console.log("err" , err);
            throw err
        }
       
    }

    async function add({ orderId, ...order }) {
        const db = await database
        if (orderId) {
            order._id = db.makeId(orderId)
        }
        if (order.address) {
            order.address = db.makeId(order.address)
        }
        if (order.voucherId) {
            order.voucherId = db.makeId(order.voucherId)
        }

        if (order.vendorId) {
            order.vendorId = db.makeId(order.vendorId)
        }
        if (order.userId) {
            order.userId = db.makeId(order.userId)
        }

        order.createdDate = new Date()
        order.lastUpdatedDate = new Date()

        //console.log("ORDER" , order.createdDate);

        const { result, ops } = await db
            .collection('orders')
            .insertOne(order)
            .catch(mongoError => {
                const [errorCode] = mongoError.message.split(' ')
                if (errorCode === 'E11000') {
                    const [_, mongoIndex] = mongoError.message.split(':')[2].split(' ')
                    throw new UniqueConstraintError(
                        mongoIndex === 'orderEmailIndex' ? 'emailAddress' : 'orderId'
                    )
                }
                throw mongoError
            })
        return {
            success: result.ok === 1,
            created: documentToorder(ops[0])
        }
    }

    async function singleOrder(id) {
        try{
            const db = await database
            let query = { show: true }
            if(id){
                query = {...query , _id : await db.makeId(id)}
            }
    
            let orderDdetails = await db
                .collection('orders')
                .findOne(query);
                
            //console.log("orderData" , orderDdetails ,query);
    
            return orderDdetails

        }
        catch(err){
            //console.log("err" , err);
        }
     
    }


    async function findById({ orderId }) {
        const db = await database;
        let configrations = await db
        .collection('configurations')
        .findOne();
        // const found = await db
        //     .collection('orders')
        //     .findOne({ _id: db.makeId(orderId) })

        let found = await db.collection("orders").aggregate([
            {
                $match: { _id: db.makeId(orderId) }
            },
            {
                $lookup:
                {
                    from: "addresses",
                    localField: "address",
                    foreignField: "_id",
                    as: "address"
                }
            },

            {
                $lookup:
                {
                    from: "vendors",
                    localField: "vendorId",
                    foreignField: "_id",
                    as: "vendor"
                }
            },
        
            {
                $lookup:
                {
                    from: "vouchers",
                    let: { voucher_id: "$voucherId" },
                    pipeline: [
                        {
                            $match:
                            {
                                $expr:
                                    { $eq: ["$_id", "$$voucher_id"] }

                            }
                        },
                        //    { $project: { _id: 1  }}
                    ],
                    as: "voucher"
                }
            },
            {
                $lookup:
                {
                    from: "users",
                    let: { user_id: "$userId" },
                    pipeline: [
                        {
                            $match:
                            {
                                $expr:
                                    { $eq: ["$_id", "$$user_id"] }

                            }
                        },
                        { $project: { password: 0, _id: 1 , cardId : 0 } }
                    ],
                    as: "user"
                }
            },
            {
                $lookup:
                {
                    from: "users",
                    let: { rider_id: "$riderId" },
                    pipeline: [
                        {
                            $match:
                            {
                                $expr:
                                    { $eq: ["$_id", "$$rider_id"] }

                            }
                        },
                        { $project: { password: 0, _id: 1 , cardId : 0 } }
                    ],
                    as: "rider"
                }
            },
            {
                $project: {
                    _id: 1, products: 1, totalPrice: 1, deliveryService: 1, serviceFee: 1, tax: 1, subTotal: 1, contactLess: 1,paymentId:1, orderStatus: 1,riderCharges:1,
                    orderHistory: 1, createdDate: 1, lastUpdatedDate: 1, address: { $arrayElemAt: ["$address", 0] }, rider: { $arrayElemAt: ["$rider", 0] },riderChargesTax : 1, 
                    vendor: { $arrayElemAt: ["$vendor", 0] },tip: 1 , itemsTax: 1 ,serviceTax:1 ,  orderNo: 1, user: { $arrayElemAt: ["$user", 0] }, voucher: { $arrayElemAt: ["$voucher", 0] }

                }
            }
        ]).toArray();
        let products = found[0]["products"];
        let product_id = products.map(x=> x.id)
        let product_data = []
        for (let index = 0; index < product_id.length; index++) {
            let p_data = await db.collection("categories").findOne({"products.productId" : db.makeId(product_id[index])});
            if(!p_data){
                return 'product Id is not valid'
            }
            let p =  p_data["products"]
            let one_product = p.filter(f=>{
              return  `${f.productId}` == `${product_id[index]}`})[0];
              one_product["totalPrice"] = parseInt(one_product["unitPrice"]) + parseInt(configrations.productMarkup);
              one_product["categoryName"] = p_data.categoryName;
              product_data = [...product_data ,one_product ]
        }
        let updatedOrder =await {...found[0] ,productDetailsList : product_data}

        return updatedOrder
    }

    async function findByEmail({ emailAddress }) {
        const db = await database
        const results = await db
            .collection('orders')
            .find({ emailAddress })
            .toArray()
        return results.map(documentToorder)
    }

    async function remove({ orderId }) {
        const db = await database
        const query = {
            $set: { show: false }
        }

        const { result } = await db.collection('orders').updateOne({
            _id: db.makeId(orderId),
        }, query, { strict: false })


        return result
    }

    // todo:
    async function replace(order) { }

    // todo:
    async function update(id, order, orderHistory = {}) {
        order.lastUpdatedDate = new Date()
        const db = await database
        var q = {};
        if (order.riderId) {
            order.riderId = db.makeId(order.riderId)
        }

        for (var item in order) {
            //console.log(item)
            q[item] = order[item]
        }


        let query = {
            $set: q
        }
        if (orderHistory && orderHistory.action) {
            query = { ...query, $push: { orderHistory: orderHistory } }
        }

        //console.log("que", query);
        const { result } = await db.collection('orders').updateOne({
            _id: db.makeId(id),
        }, query, { upsert: true })

        //console.log(result)

        if (result.nModified != 1) {
            return {
                success: false,
                error: "Something went wrong when performing this operation."
            }
        }

        return order
    }

    async function findLastOrder() {
        const db = await database;
        let data = await db.collection("orders").find().sort({_id :-1}).limit(1).toArray();
        //console.log("data" , data);
        return data
    }

    async function configrations() {
        const db = await database;
        let configrations = await db
            .collection('configurations')
            .findOne();
        //console.log("configurations", configrations)
        return configrations
    }

    function documentToorder({ _id: orderId, show, ...doc }) {
        //console.log("doc", doc, "----------");
        return makeorder({ orderId, ...doc })

        // else{
        //     return {success : false , errormsg : "Order has been deleted"}
        // } 

    }

    async function validateVoucher(code) {
        const db = await database;
        let vouchers = await db
            .collection('vouchers')
            .findOne({ code: code, status: true });
        //console.log("configurations", vouchers)
        return vouchers
    }

    async function updateVoucher(voucher) {
        const db = await database;
        var q = {};

        for (var item in voucher) {
            //console.log(item)
            q[item] = voucher[item]
        }

        const query = {
            $set: q
        }
        let vouchers = await db.collection('vouchers').updateOne({
            _id: db.makeId(voucher._id),
        }, query, { strict: false })
        //console.log("configurations", vouchers)
        return vouchers
    }
}