Untitled

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