Untitled
exports.filterOrders = catchAsync(async (req, res, next) => { const { category, status,payment_status, startDate, endDate, limitDate } = 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 = {}; if (req?.user?.role == 'adv') { filter.isvalid = false; } else if (req?.user?.role == 'manager') { filter.isvalid = true; filter.manager = 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,phone : 1 } }], as: 'clientName' } }, { $lookup: { from: 'managers', localField: 'manager', foreignField: '_id', pipeline: [{ $lookup: { from: 'users', localField: '_id', foreignField: 'profile', pipeline: [{ $project: { name: 1 ,phone : 1} }], as: 'clientName' } }], as: 'managerName' } }, // 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; for(let i =0;i< order?.products.length;i++){ obj.products[i].image = order?.product?.at(i)?.images?.at(0); } 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.pdf = order?.pdf || ''; obj.image = order?.image || ''; obj.delivery_estimate = order?.delivery_estimate; obj.note_dipo = order?.note_dipo; obj.managerName = order?.managerName?.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