/// <summary>
        /// Update RetrievalDetail data to RetrievalDetail Table according to the RetrievalDetail Parameter
        /// Return Constants.DB_STATUS
        /// </summary>
        /// <param name="retrievalDetail"></param>
        /// <returns></returns>
        public Constants.DB_STATUS Update(RetrievalDetail retrievalDetail)
        {
            Constants.DB_STATUS status = Constants.DB_STATUS.UNKNOWN;
            try
            {
                RetrievalDetail rDetail = inventory.RetrievalDetails.Where(rObj => rObj.Id == retrievalDetail.Id).First();
                if (!rDetail.Equals(null))
                {
                    retrieval = inventory.Retrievals.Where(r => r.Id == retrievalDetail.Retrieval.Id).First();
                    Item item = inventory.Items.Where(i => i.Id == retrievalDetail.Item.Id).First();
                    Department department = inventory.Departments.Where(d => d.Id == retrievalDetail.Department.Id).First();

                    rDetail.Retrieval = retrieval;
                    rDetail.Item = item;
                    rDetail.Department = department;
                    rDetail.NeededQty = retrievalDetail.NeededQty;
                    rDetail.ActualQty = retrievalDetail.ActualQty;
                    inventory.SaveChanges();
                    status = Constants.DB_STATUS.SUCCESSFULL;
                }
            }
            catch (Exception e)
            {
                status = Constants.DB_STATUS.FAILED;
            }
            return status;
        }
 /// <summary>
 /// There is no status in RetrievalTable.
 /// </summary>
 /// <param name="retrievalDetail"></param>
 /// <returns></returns>
 public Constants.DB_STATUS Delete(RetrievalDetail retrievalDetail)
 {
     throw new NotImplementedException();
 }
        /// <summary>
        ///  Insert RetrievalDetail data to the RetrievalDetail Table according to the RetrievalDetail Parameter
        ///  Return Constants.DB_STATUS
        /// </summary>
        /// <param name="newRetrievalDetail"></param>
        /// <returns></returns>
        public Constants.DB_STATUS Insert(RetrievalDetail newRetrievalDetail)
        {
            Constants.DB_STATUS status = Constants.DB_STATUS.UNKNOWN;

            try
            {
                inventory.AddToRetrievalDetails(newRetrievalDetail);
                inventory.SaveChanges();
                status = Constants.DB_STATUS.SUCCESSFULL;
            }
            catch (Exception e)
            {
                status = Constants.DB_STATUS.FAILED;
            }

            return status;
        }
        /// <summary>
        /// Retrieve the RetrievalDetail information  from RetrievalDetail Table according to the RetrievalDetail Parameter
        /// </summary>
        /// <param name="retrievalDetail"></param>
        /// <returns></returns>
        public RetrievalDetail GetRetrievalDetail(RetrievalDetail retrievalDetail)
        {
            try
            {
                retrievalDetail = inventory.RetrievalDetails.Where(rObj => rObj.Id == retrievalDetail.Id).First();
            }
            catch (Exception e)
            {
                retrievalDetail = null;
            }

                return retrievalDetail;
        }
 /// <summary>
 /// Deprecated Method for adding a new object to the RetrievalDetails EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
 /// </summary>
 public void AddToRetrievalDetails(RetrievalDetail retrievalDetail)
 {
     base.AddObject("RetrievalDetails", retrievalDetail);
 }
 /// <summary>
 /// Create a new RetrievalDetail object.
 /// </summary>
 /// <param name="id">Initial value of the Id property.</param>
 /// <param name="neededQty">Initial value of the NeededQty property.</param>
 public static RetrievalDetail CreateRetrievalDetail(global::System.Int32 id, global::System.Int32 neededQty)
 {
     RetrievalDetail retrievalDetail = new RetrievalDetail();
     retrievalDetail.Id = id;
     retrievalDetail.NeededQty = neededQty;
     return retrievalDetail;
 }
        public ManageStationeryRetrievalListControl(object obj)
        {
            if (obj is List<RequisitionCollection>)
            {
                init();
                requisitionCollectionBroker = new RequisitionCollectionBroker(inventory);
                List<RequisitionCollection> requisitionCollectionList = (List<RequisitionCollection>)obj;

                retrieval = new Retrieval(retrievalBroker.GetRetrievalId(), DateTime.Now, Util.GetEmployee(employeeBroker), Converter.objToInt(Constants.VISIBILITY_STATUS.SHOW));

                retrievalList = new Dictionary<string, List<object>>();
                unfulfilledRetrievalList = new Dictionary<string, List<object>>();

                foreach (RequisitionCollection requisitionCollection in requisitionCollectionList)
                {
                    foreach (RequisitionCollectionDetail requisitionCollectionDetail in requisitionCollection.RequisitionCollectionDetails)
                    {
                        foreach (RequisitionDetail requisitionDetail in requisitionCollectionDetail.Requisition.RequisitionDetails)
                        {
                            if (unfulfilledRetrievalList.ContainsKey(requisitionDetail.Item.Id.Trim()))
                            {
                                retrievalInfo = unfulfilledRetrievalList[requisitionDetail.Item.Id];
                                retrievalInfo[2] = Converter.objToInt(retrievalInfo[2]) + Converter.objToInt(requisitionDetail.Qty);
                                ((RetrievalTable)retrievalInfo[4]).Add(requisitionCollectionDetail.Requisition.Department.Name, requisitionDetail.Qty, 0, requisitionCollectionDetail.Requisition.CreatedDate);

                                // have the same total with current balance / fulfilled
                                //if (Converter.objToInt(retrievalInfo[2]) <= Converter.objToInt(retrievalInfo[3]))
                                //{
                                //    ((RetrievalTable)retrievalInfo[4]).FullFill();
                                //    retrievalList.Add(requisitionDetail.Item.Id, retrievalInfo);
                                //    unfulfilledRetrievalList.Remove(requisitionDetail.Item.Id);
                                //}
                                //else
                                //{
                                    unfulfilledRetrievalList[requisitionDetail.Item.Id] = retrievalInfo;
                                //}
                            }
                            else
                            {
                                retrievalInfo = new List<object>();
                                retrievalInfo.Add(requisitionDetail.Item.Description);
                                retrievalInfo.Add(requisitionDetail.Item.Bin);
                                retrievalInfo.Add(requisitionDetail.Qty);
                                int currentItemBalance = itemBroker.GetCurrentBalance(requisitionDetail.Item);
                                retrievalInfo.Add(currentItemBalance);
                                retrievalInfo.Add(new RetrievalTable(requisitionCollectionDetail.Requisition.Department.Name, requisitionDetail.Qty, 0, requisitionCollectionDetail.Requisition.CreatedDate));

                                //if (requisitionDetail.Qty <= currentItemBalance)
                                //{
                                //    retrievalList.Add(requisitionDetail.Item.Id, retrievalInfo);
                                //}
                                //else
                                //{
                                    unfulfilledRetrievalList.Add(requisitionDetail.Item.Id.Trim(), retrievalInfo);
                                //}
                            }
                        }
                    }
                    requisitionCollection.Status = Converter.objToInt(Constants.COLLECTION_STATUS.NEED_TO_COLLECT);
                    requisitionCollectionBroker.Update(requisitionCollection);
                }

                List<string> keyToBeRemoved = new List<string>();
                foreach (string key in unfulfilledRetrievalList.Keys)
                {
                    retrievalInfo = unfulfilledRetrievalList[key];
                    if (((RetrievalTable)retrievalInfo[4]).GetTotalQty("NeededQty") <= Converter.objToInt(retrievalInfo[3]))
                    {
                        ((RetrievalTable)retrievalInfo[4]).FullFill();
                        retrievalList.Add(key, retrievalInfo);
                        keyToBeRemoved.Add(key);
                    }
                }

                foreach (string key in keyToBeRemoved)
                {
                    unfulfilledRetrievalList.Remove(key);
                }

                int addedId = 0;

                foreach (string key in retrievalList.Keys)
                {
                    retrievalInfo = retrievalList[key];
                    Item item = new Item();
                    item.Id = key;
                    item = itemBroker.GetItem(item);

                    foreach(DataRow dr in ((RetrievalTable)retrievalInfo[4]).Rows)
                    {
                        RetrievalDetail retrievalDetail = new RetrievalDetail();
                        retrievalDetail.Id = retrievalBroker.GetRetrievalDetailId() + (addedId++);
                        retrievalDetail.Item = item;

                        Department department = new Department();
                        department.Name = dr["Department"].ToString();
                        department = departmentBroker.GetDepartment(department);
                        retrievalDetail.Department = department;

                        retrievalDetail.NeededQty = Converter.objToInt(dr["NeededQty"]);
                        retrievalDetail.ActualQty = Converter.objToInt(dr["ActualQty"]);

                        retrieval.RetrievalDetails.Add(retrievalDetail);
                    }
                }

                foreach (string key in unfulfilledRetrievalList.Keys)
                {
                    retrievalInfo = unfulfilledRetrievalList[key];
                    Item item = new Item();
                    item.Id = key;
                    item = itemBroker.GetItem(item);

                    foreach (DataRow dr in ((RetrievalTable)retrievalInfo[4]).Rows)
                    {
                        RetrievalDetail retrievalDetail = new RetrievalDetail();
                        retrievalDetail.Id = retrievalBroker.GetRetrievalDetailId() + (addedId++);
                        retrievalDetail.Item = item;

                        Department department = new Department();
                        department.Name = dr["Department"].ToString();
                        department = departmentBroker.GetDepartment(department);
                        retrievalDetail.Department = department;

                        retrievalDetail.NeededQty = Converter.objToInt(dr["NeededQty"]);
                        retrievalDetail.ActualQty = Converter.objToInt(dr["ActualQty"]);

                        retrieval.RetrievalDetails.Add(retrievalDetail);
                    }
                }

                if (retrievalBroker.Insert(retrieval) == Constants.DB_STATUS.FAILED)
                {
                    // do something
                }
            }
        }