/// <summary>
        /// ApproveAdj
        /// </summary>
        /// <param name="AdjID">AdjustmentVoucher ID</param>
        /// <returns>true or false</returns>
        public bool approveAdj(string AdjID, string ApprovedBy)
        {
            bool result = true;

            //change status of adj voucher to approve
            AdjustmentVoucher adjvoucher = (from x in ctx.AdjustmentVoucher
                          where x.AdjID == AdjID
                          select x).First();
            adjvoucher.Status = "APPROVED";
            adjvoucher.ApprovedBy = Convert.ToInt32(ApprovedBy);

            List<AdjustmentDetail> adjDetailList = (from l in ctx.AdjustmentDetail
                        where l.AdjID == AdjID
                        select l).ToList();

            foreach(AdjustmentDetail adjDetail in adjDetailList)
            {
                string itemID = adjDetail.ItemID;

                //update stock in item
                Item item = ctx.Item.Where(x => x.ItemID == itemID).FirstOrDefault();
                item.Stock += adjDetail.Qty;

                //update stock card
                StockCard stockCard = new StockCard();
                stockCard.ItemID = itemID;
                stockCard.Date = DateTime.Now;
                stockCard.Description = "Stock Adjustment " + AdjID;
                stockCard.Qty = adjDetail.Qty;
                stockCard.Balance = item.Stock + adjDetail.Qty;
                ctx.StockCard.Add(stockCard);

            }

            try
            {
                ctx.SaveChanges();
            }
            catch
            {
                result = false;
            }

            if (result == true)
            {
                //send notification:
                NotificationController nt = new NotificationController();
                nt.sendNotification(8, Convert.ToInt32(adjvoucher.ReportedBy), adjvoucher.AdjID);
            }

            return result;
        }
        /// <summary>
        /// Restock
        /// </summary>
        /// <param name="PoDetailList">PoDetailList(PoID, ItemID, ActualQty)</param>
        /// <returns></returns>
        public bool restock(List<PurchaseOrderDetail> PoDetailList)
        {
            bool result = true;

            //search for purchase order to obtain supplier ID
            int poID = (int)PoDetailList.First().PoID;
            PurchaseOrder po = ctx.PurchaseOrder.Where(x => x.PoID == poID).FirstOrDefault();

            foreach(PurchaseOrderDetail poDetail in PoDetailList)
            {
                //Update the actual qty for every poDetail
                PurchaseOrderDetail poDetailSearch = ctx.PurchaseOrderDetail
                    .Where(x => x.PoID == poDetail.PoID && x.ItemID == poDetail.ItemID)
                    .FirstOrDefault();

                poDetailSearch.ActualQty = poDetail.ActualQty;

                //update stock in item
                Item item = ctx.Item.Where(x => x.ItemID == poDetail.ItemID).FirstOrDefault();
                item.Stock += poDetail.ActualQty;

                //update stock card
                StockCard stockCard = new StockCard();
                stockCard.ItemID = poDetail.ItemID;
                stockCard.Date = DateTime.Now;
                stockCard.Description = "Supplier - " + po.SupplierID;
                stockCard.Qty = poDetail.ActualQty;
                stockCard.Balance = item.Stock + poDetail.ActualQty;
                ctx.StockCard.Add(stockCard);
            }

            //change status of purchase order to "Delivered"
            po.Status = "DELIVERED";

            try
            {
                ctx.SaveChanges();
            }
            catch
            {
                result = false;
            }

            return result;
        }
        /// <summary>
        /// confirmAllocation
        /// </summary>
        /// <param name="reqDetailList">RequisitionDetail List (ReqID, ItemID, IssueQty)</param>
        /// <returns></returns>
        public bool confirmAllocation(List<RequisitionDetail> reqDetailList)
        {
            bool result = true;

            foreach(RequisitionDetail reqDetail in reqDetailList)
            {
                //update requisition detail issue quantity
                RequisitionDetail reqDetailSearch = ctx.RequisitionDetail
                    .Where(x => x.ReqID == reqDetail.ReqID && x.ItemID == reqDetail.ItemID)
                    .FirstOrDefault();

                reqDetailSearch.IssueQty = reqDetail.IssueQty;

                //search for requisition to obtain the DeptID
                Requisition req = ctx.Requisition.Where(x => x.ReqID == reqDetail.ReqID).FirstOrDefault();
                //search for department name
                string deptName = ctx.Department.Where(x => x.DeptID == req.DeptID).FirstOrDefault().DeptName;

                //update stock in item
                Item item = ctx.Item.Where(x => x.ItemID == reqDetail.ItemID).FirstOrDefault();
                item.Stock -= reqDetail.IssueQty;

                //update stock card
                StockCard stockCard = new StockCard();
                stockCard.ItemID = reqDetail.ItemID;
                stockCard.Date = DateTime.Now;
                stockCard.Description = deptName;
                stockCard.Qty = 0 - reqDetail.IssueQty;
                stockCard.Balance = item.Stock - reqDetail.IssueQty;
                ctx.StockCard.Add(stockCard);
            }

            try
            {
                ctx.SaveChanges();
            }
            catch
            {
                result = false;
            }

            //send notifications to relevant requisitions:
            if (result == true)
            {
                foreach (RequisitionDetail reqDetail in reqDetailList)
                {
                    //send notification to alert low inventory
                    bool checkedItemAlr = false;
                    List<String> itemCodeChecked = new List<String>();
                    if (itemCodeChecked.Count > 0)
                    {
                        for (int i = 0; i < itemCodeChecked.Count; i++)
                        {
                            if (reqDetail.ItemID == itemCodeChecked[i])
                            {
                                checkedItemAlr = true;
                            }
                        }
                    }
                    if (checkedItemAlr == false)
                    {
                        Item i = ctx.Item.Where(x => x.ItemID == reqDetail.ItemID).FirstOrDefault();
                        if (i.Stock < i.RoLvl)
                        {
                            NotificationController nt = new NotificationController();
                            nt.sendNotification(14, 0, i.ItemID);
                        }
                    }

                    //send notification to req owners to notify change in status
                    bool checkedReqIdAlr = false;
                    List<int> reqIdChecked = new List<int>();
                    if (reqIdChecked.Count > 0) {
                        for (int i = 0; i < reqIdChecked.Count; i++)
                        {
                            if(Convert.ToInt32(reqDetail.ReqID) == reqIdChecked[i])
                            {
                                checkedReqIdAlr = true;
                            }
                        }
                    }
                    if(checkedReqIdAlr == false)
                    {
                        reqIdChecked.Add(Convert.ToInt32(reqDetail.ReqID));
                        List<RequisitionDetail> reqItems = ctx.RequisitionDetail.Where(x => x.ReqID == reqDetail.ReqID).ToList();
                        bool unfulfilledItemsFound = false;
                        foreach (RequisitionDetail item in reqItems)
                        {
                            if (item.RequestQty < item.IssueQty)
                            {
                                unfulfilledItemsFound = true;
                            }
                        }
                        if (unfulfilledItemsFound == true)
                        {
                            //send notification:
                            NotificationController nt = new NotificationController();
                            nt.sendNotification(10, 0, Convert.ToString(reqDetail.ReqID));
                        }
                    }
                }
            }

            return result;
        }