Untitled

 avatar
unknown
plain_text
a month ago
4.9 kB
3
Indexable
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