Untitled
exports.filterOrders = catchAsync(async (req, res, next) => { const { category, status, payment_status, startDate, endDate, limitDate,role } = req.body; const page = parseInt(req.query.page); const limit = parseInt(req.query.limit); if (!page || !limit) { return next(new AppError('page and limit required', 400)); } let category_filter = {}; let filter = {}; console.log("body :***** : ",req.body); if (role == 'adv') { filter.isvalid = false; } else if (role == 'salesman') { filter.isvalid = true; filter.sales_man = req?.user?.profile; } else { filter.isvalid = true; } if (category) { const Id = toObjectId(category, next); let id_category = await Category.findById(Id); if (id_category) { //arrayAND.push({ categories: Id }); category_filter.categories = Id; } else { return next(new AppError('invalid categorie value', 400)); } } if (status == 'pending' || status == 'processing' || status == 'cancel' || status == 'delivered') { filter.status = status; } //['paid', 'unpaid', 'partial paid'], if (payment_status == 'paid' || payment_status == 'unpaid' || payment_status == 'partial paid') { filter.payment_status = payment_status; } if (limitDate) { var currentDate = new Date(); let days = parseInt(limitDate); currentDate.setDate(currentDate.getDate() - days); filter.createdAt = { $gte: currentDate }; } if (startDate && !endDate) { let date = new Date(startDate); if (date == 'Invalid Date') { return next(new AppError('Invalid Date', 400)); } filter.createdAt = { $gte: date }; } if (!startDate && endDate) { let date = new Date(endDate); date.setDate(date.getDate() + 1); if (date == 'Invalid Date') { return next(new AppError('Invalid Date', 400)); } filter.createdAt = { $lte: date }; } if (startDate && endDate) { let start_date = new Date(startDate); let end_date = new Date(endDate); end_date.setDate(end_date.getDate() + 1); if (start_date == 'Invalid Date' || end_date == 'Invalid Date') { return next(new AppError('Invalid Date', 400)); } filter.createdAt = { $gte: start_date, $lte: end_date }; } const results = await Order.aggregate([ { $match: filter }, { $sort: { createdAt: -1 } }, { $lookup: { from: 'products', localField: 'products.product', foreignField: '_id', pipeline: [{ $match: category_filter }], as: 'product' } }, { $lookup: { from: 'users', localField: 'ordered_by', foreignField: '_id', pipeline: [{ $project: { name: 1 } }], as: 'clientName' } }, { $lookup: { from: 'salesmen', localField: 'sales_man', foreignField: '_id', pipeline: [ { $lookup: { from: 'users', localField: '_id', foreignField: 'profile', pipeline: [{ $project: { name: 1 } }], as: 'clientName' } } ], as: 'salesmanName' } }, // sales_man { $limit: (page - 1) * limit + limit }, { $sort: { createdAt: -1 } }, { $skip: (page - 1) * limit } ]); const data = results.reduce((result, order) => { let obj = {}; obj.units = order?.products.length; obj.id = order?._id; obj.product = {}; obj.products = order?.products; obj.product.name = order?.products?.at(0)?.product_name; obj.product.image = order?.product?.at(0)?.images?.at(0); obj.price = order?.totalPrice; obj.status = order?.status; obj.payment_method = order?.payment_method; obj.payment_status = order?.payment_status; if (order?.payment_status == 'part') { obj.payment_value = order?.payment_value; } obj.nb_tracking = order?.nb_tracking || ''; obj.nb_colis = order?.nb_colis || ''; obj.payment_value = order?.payment_value || ''; obj.shipping_company = order?.shipping_company || ''; obj.shipping_company_website = order?.shipping_company_website || ''; obj.note = order?.note || ''; obj.salesmanName = order?.salesmanName?.at(0)?.clientName?.at(0)?.name; obj.clientName = order?.clientName?.at(0)?.name; result.push(obj); return result; }, []); const count = await Order.find(filter).count(); res.status(200).json({ status: 'success', count, data }); });
Leave a Comment