| Current Path : /var/node/inatote/Inatote-Backend/orders/ |
| 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
}
}