public ActionResult GetPriorityItemsForReOrder() { List <RequestDetail> unfulfilledRequestDetails = RequestDao.GetUnfulfilledRequestDetails(); //need to consider which requests are prepared but not delivered yet List <int> requestIdWithPreparedDisbursement = unfulfilledRequestDetails.Where(rd => rd.Request.DisbursementStatus == (int)RequestRetrievalStatus.Prepared) .Select(rd => rd.Request.RequestId).Distinct().ToList(); //get prepared disbursement details List <DisbursementDetail> disbursementDetails = DisbursementDao.GetPreparedDisbursementByRequestIds(requestIdWithPreparedDisbursement); //get prepared item id as key and prepared amount as value in dictionary Dictionary <int, int> preparedItemsDict = disbursementDetails.GroupBy(dd => dd.Item.ItemId) .ToDictionary(cl => cl.Key, cl => cl.Sum(dd => dd.Quantity)); //item id as key and required amount as dictionary value Dictionary <int, int> requiredItemDict = unfulfilledRequestDetails.GroupBy(rd => rd.Item.ItemId) .ToDictionary(cl => cl.Key, cl => cl.Sum(rd => (rd.Quantity - rd.DeliveredQuantity))); //get item key to pass as an argument to finding item instock info List <int> itemIds = requiredItemDict.Keys.ToList(); List <Item> currentStockItems = ItemDao.GetCurrentStockInfoByIds(itemIds); List <object> requiredItemsInfo = new List <object>(); foreach (var i in currentStockItems) { int unfulfilledAmount = requiredItemDict[i.ItemId]; if (i.Quantity == 0 || i.Quantity <= unfulfilledAmount) { int preparedAmount = 0; int requiredQty = 0; int suggestedQty = 0; if (preparedItemsDict.ContainsKey(i.ItemId)) { preparedAmount = preparedItemsDict[i.ItemId]; requiredQty = unfulfilledAmount; if (requiredQty == preparedAmount) { suggestedQty = 0; } else { suggestedQty = requiredQty - preparedAmount + 10; } } else { requiredQty = unfulfilledAmount - i.Quantity; if (requiredQty == 0) { suggestedQty = 0; } else { suggestedQty = requiredQty + 10; } } if (suggestedQty != 0) { var itemInfo = new { Description = i.Description, ItemId = i.ItemId, Category = i.Category, SuggestedQty = suggestedQty, UOM = i.UnitOfMeasure }; requiredItemsInfo.Add(itemInfo); } } } return(Json(requiredItemsInfo, JsonRequestBehavior.AllowGet)); }