public List <ItemInfobyReqiIdModel> getAggregatedItems(DeptLevelReqController deptLevelReq)
        {
            // Hm [itemcode, POJO3 aggregated]
            Dictionary <string, ItemInfobyReqiIdModel> temp_Dic_AggregatedItems = new Dictionary <string, ItemInfobyReqiIdModel>();


            Dictionary <string, List <ItemInfobyReqiIdModel> > temp_DeptReqi = deptLevelReq.DeptReqi;


            foreach (var key in temp_DeptReqi.Keys)
            {
                ItemInfobyReqiIdModel reqItemInfo = new ItemInfobyReqiIdModel();
                foreach (ItemInfobyReqiIdModel itemInfoReq in temp_DeptReqi[key])
                {
                    if (temp_Dic_AggregatedItems.ContainsKey(itemInfoReq.ItemCode1))
                    {
                        temp_Dic_AggregatedItems[itemInfoReq.ItemCode1].ItemQty = temp_Dic_AggregatedItems[itemInfoReq.ItemCode1].ItemQty + itemInfoReq.ItemQty;
                    }
                    else
                    {
                        temp_Dic_AggregatedItems.Add(itemInfoReq.ItemCode1, itemInfoReq);
                    }
                }
            }


            // make list of items values
            List <ItemInfobyReqiIdModel> temp_Dic_AggregatedItems_List = new List <ItemInfobyReqiIdModel>();

            foreach (var key in temp_Dic_AggregatedItems.Keys)
            {
                temp_Dic_AggregatedItems_List.Add(temp_Dic_AggregatedItems[key]);
            }

            return(temp_Dic_AggregatedItems_List);
        }
        protected void showDisbursementBtn_Clicks(object sender, EventArgs e)
        {
            List <string> reqIDList = (List <string>)Session["selectedReqIdsList"];

            control.UpdateReqIdStatus(selectedReqIdsList);
            for (int i = 0; i < itemGridView.Rows.Count; i++)
            {
                TextBox txtTotal   = (TextBox)itemGridView.Rows[i].FindControl("ProvidingTxtBox");
                int     qtyInStore = Convert.ToInt32(txtTotal.Text);
                string  itemcode   = itemGridView.Rows[i].Cells[1].Text;
                int     neededQty  = Convert.ToInt32(itemGridView.Rows[i].Cells[3].Text);
                if (Convert.ToInt32(txtTotal.Text) > neededQty)
                {
                    Page.ClientScript.RegisterStartupScript(this.GetType(), "script", "<script>alert('Assigned quanity can not be more than needed quantity!!!')</script>");
                    txtTotal.Text = neededQty.ToString();
                }
            }

            Dictionary <string, DeptLevelReqController> mstrDic_Dept = new Dictionary <string, DeptLevelReqController>();
            Dictionary <string, int> underNeededItem_Dic             = new Dictionary <string, int>();
            Dictionary <string, int> NeededItem_Dic = new Dictionary <string, int>();
            Dictionary <string, List <ItemInfobyReqiIdModel> > deptReqDictionary = new Dictionary <string, List <ItemInfobyReqiIdModel> >(); //pojo2 dictionary
            List <DeptLevelReqController> deptLevelReqList = new List <DeptLevelReqController>();                                            //Pojo 2 list
            Dictionary <string, Dictionary <string, int> >     depConsolidatedDic = new Dictionary <string, Dictionary <string, int> >();
            Dictionary <string, List <ItemInfobyReqiIdModel> > depToItem          = new Dictionary <string, List <ItemInfobyReqiIdModel> >();
            Dictionary <string, List <ItemInfobyReqiIdModel> > specialReqDic      = new Dictionary <string, List <ItemInfobyReqiIdModel> >();
            Dictionary <string, List <ItemInfobyReqiIdModel> > urgentReqDic       = new Dictionary <string, List <ItemInfobyReqiIdModel> >();
            Dictionary <string, List <ItemInfobyReqiIdModel> > normalReqDic       = new Dictionary <string, List <ItemInfobyReqiIdModel> >();

            selectedReqIdsList = (List <string>)Session["selectedReqIdsList"];
            // List<string> deptList = control.GetDeptList(selectedReqIdsList);
            //populate Pojo 3
            foreach (string reqiId in selectedReqIdsList)                           //1
            {
                List <RequisitionItem>       reqiItemByReqId      = control.GetreqItemListByReqId(reqiId);
                List <ItemInfobyReqiIdModel> ItemInfobyReqiIdList = new List <ItemInfobyReqiIdModel>();
                foreach (RequisitionItem reqItem in reqiItemByReqId)
                {
                    ItemInfobyReqiIdModel iteminfoByReq = new ItemInfobyReqiIdModel();
                    iteminfoByReq.ReuisitionId1 = reqiId;
                    iteminfoByReq.ItemCode1     = reqItem.Item_ID;
                    iteminfoByReq.ItemQty       = reqItem.Required_Qty;
                    ItemInfobyReqiIdList.Add(iteminfoByReq);
                }
                if (control.GetRequisitionTypeByReqId(reqiId) == "Special")
                {
                    specialReqDic.Add(reqiId, ItemInfobyReqiIdList);
                }
                if (control.GetRequisitionTypeByReqId(reqiId) == "Urgent")
                {
                    urgentReqDic.Add(reqiId, ItemInfobyReqiIdList);
                }
                if (control.GetRequisitionTypeByReqId(reqiId) == "Normal")
                {
                    normalReqDic.Add(reqiId, ItemInfobyReqiIdList);
                }
                deptReqDictionary.Add(reqiId, ItemInfobyReqiIdList);                                                                                                       //duplicacy

                Dictionary <string, List <ItemInfobyReqiIdModel> > deptReqDictionary_tmp2PopulateMstrListPojo2 = new Dictionary <string, List <ItemInfobyReqiIdModel> >(); //pojo2 dictionary
                deptReqDictionary_tmp2PopulateMstrListPojo2.Add(reqiId, ItemInfobyReqiIdList);
                string dept_Name = control.GetDepName(reqiId);
                DeptLevelReqController deptLevelReq = new DeptLevelReqController();
                deptLevelReq.DeptName = dept_Name;
                deptLevelReq.DeptReqi = deptReqDictionary_tmp2PopulateMstrListPojo2; // populate Pojo2 ???
                deptLevelReqList.Add(deptLevelReq);                                  //pojo 2 lis
            }


            //start   populating undrneeded and needed map
            for (int i = 0; i < itemGridView.Rows.Count; i++)
            {
                TextBox txtTotal   = (TextBox)itemGridView.Rows[i].Cells[4].FindControl("ProvidingTxtBox");
                int     qtyInStore = Convert.ToInt32(txtTotal.Text);

                string itemcode  = itemGridView.Rows[i].Cells[1].Text;
                int    neededQty = Convert.ToInt32(itemGridView.Rows[i].Cells[3].Text);
                if (Convert.ToInt32(txtTotal.Text) > neededQty)
                {
                    Page.ClientScript.RegisterStartupScript(this.GetType(), "script", "<script>alert('Assigned quanity can not be more than needed quantity!!!')</script>");
                    txtTotal.Text = neededQty.ToString();
                }

                NeededItem_Dic[itemcode] = neededQty;
                if (qtyInStore < neededQty)
                {
                    underNeededItem_Dic[itemcode] = qtyInStore;
                }
            }

            //end



            for (int index = 0; index < specialReqDic.Count; index++)
            {
                int    y     = specialReqDic.Count;
                var    item  = specialReqDic.ElementAt(index);
                string reqId = item.Key;
                List <ItemInfobyReqiIdModel> reqIdItemList = item.Value;
                string deptName = control.GetDepName(reqId);

                foreach (DeptLevelReqController depLevelReq in deptLevelReqList)                //deplevel final map
                {
                    //deptReqDictionary=Session["deptReqDictionary"];
                    if (depLevelReq.DeptName == deptName)
                    {
                        List <ItemInfobyReqiIdModel> reqIdItemInfo = deptReqDictionary[reqId];
                        foreach (ItemInfobyReqiIdModel itemInfoByreq in reqIdItemInfo)
                        {
                            string itemCode = itemInfoByreq.ItemCode1;
                            int    assign   = itemInfoByreq.ItemQty;

                            //start  allocating quantity
                            if (underNeededItem_Dic.ContainsKey(itemCode))
                            {
                                if (itemInfoByreq.ItemQty < underNeededItem_Dic[itemCode])
                                {
                                    itemInfoByreq.Item_assigned1  = itemInfoByreq.ItemQty;
                                    underNeededItem_Dic[itemCode] = underNeededItem_Dic[itemCode] - itemInfoByreq.Item_assigned1;
                                }
                                else
                                {
                                    itemInfoByreq.Item_assigned1 = underNeededItem_Dic[itemCode];
                                }
                            }
                            else
                            {
                                itemInfoByreq.Item_assigned1 = itemInfoByreq.ItemQty;
                                NeededItem_Dic[itemCode]     = NeededItem_Dic[itemCode] - itemInfoByreq.Item_assigned1;
                            }

                            ///finish allocation
                        }
                    }
                }
            }



            for (int index = 0; index < urgentReqDic.Count; index++)
            {
                int    y     = urgentReqDic.Count;
                var    item  = urgentReqDic.ElementAt(index);
                string reqId = item.Key;
                List <ItemInfobyReqiIdModel> reqIdItemList = item.Value;
                string deptName = control.GetDepName(reqId);

                foreach (DeptLevelReqController depLevelReq in deptLevelReqList)
                {
                    if (depLevelReq.DeptName == deptName)
                    {
                        List <ItemInfobyReqiIdModel> reqIdItemInfo = deptReqDictionary[reqId];
                        foreach (ItemInfobyReqiIdModel itemInfoByreq in reqIdItemInfo)
                        {
                            string itemCode = itemInfoByreq.ItemCode1;
                            int    assign   = itemInfoByreq.ItemQty;

                            //start  allocating quantity
                            if (underNeededItem_Dic.ContainsKey(itemCode))
                            {
                                if (itemInfoByreq.ItemQty < underNeededItem_Dic[itemCode])
                                {
                                    itemInfoByreq.Item_assigned1  = itemInfoByreq.ItemQty;
                                    underNeededItem_Dic[itemCode] = underNeededItem_Dic[itemCode] - itemInfoByreq.Item_assigned1;
                                }
                                else
                                {
                                    itemInfoByreq.Item_assigned1 = underNeededItem_Dic[itemCode];
                                }
                            }
                            else
                            {
                                itemInfoByreq.Item_assigned1 = itemInfoByreq.ItemQty;
                                NeededItem_Dic[itemCode]     = NeededItem_Dic[itemCode] - itemInfoByreq.Item_assigned1;
                            }

                            ///finish allocation
                        }
                    }
                }
            }



            // selection from screen --- mstr map : req-item
            for (int index = 0; index < normalReqDic.Count; index++)
            {
                int    y     = normalReqDic.Count;
                var    item  = normalReqDic.ElementAt(index);
                string reqId = item.Key;
                List <ItemInfobyReqiIdModel> reqIdItemList = item.Value;
                string deptName = control.GetDepName(reqId);

                foreach (DeptLevelReqController depLevelReq in deptLevelReqList)
                {
                    if (depLevelReq.DeptName == deptName)
                    {
                        List <ItemInfobyReqiIdModel> reqIdItemInfo = deptReqDictionary[reqId];
                        foreach (ItemInfobyReqiIdModel itemInfoByreq in reqIdItemInfo)
                        {
                            string itemCode = itemInfoByreq.ItemCode1;
                            int    assign   = itemInfoByreq.ItemQty;

                            //start  allocating quantity
                            if (underNeededItem_Dic.ContainsKey(itemCode))
                            {
                                if (itemInfoByreq.ItemQty < underNeededItem_Dic[itemCode])
                                {
                                    itemInfoByreq.Item_assigned1  = itemInfoByreq.ItemQty;
                                    underNeededItem_Dic[itemCode] = underNeededItem_Dic[itemCode] - itemInfoByreq.Item_assigned1;
                                }
                                else
                                {
                                    itemInfoByreq.Item_assigned1 = underNeededItem_Dic[itemCode];
                                }
                            }
                            else
                            {                                                /////////new
                                itemInfoByreq.Item_assigned1 = itemInfoByreq.ItemQty;
                                NeededItem_Dic[itemCode]     = NeededItem_Dic[itemCode] - itemInfoByreq.Item_assigned1;
                            }

                            ///finish allocation
                        }
                    }
                }
            }



            ////for showing on screen populating dictionary depToItem[deptnmae(key),listOfItem(value)]
            foreach (DeptLevelReqController deptLevelReq in deptLevelReqList)
            {
                if (depToItem.ContainsKey(deptLevelReq.DeptName))
                {
                    List <ItemInfobyReqiIdModel> finalAggregatedItemsLis = addNewItemListIntoExistingItemList(depToItem[deptLevelReq.DeptName], getAggregatedItems(deptLevelReq));
                    depToItem.Remove(deptLevelReq.DeptName);
                    depToItem.Add(deptLevelReq.DeptName, finalAggregatedItemsLis);
                }
                else
                {
                    depToItem.Add(deptLevelReq.DeptName, getAggregatedItems(deptLevelReq));
                }
            }


            string s = "";

            for (int index = 0; index < depToItem.Count; index++)
            {
                Dictionary <string, int> itemCodeDic = new Dictionary <string, int>();
                var    item     = depToItem.ElementAt(index);
                string deptName = item.Key;
                List <ItemInfobyReqiIdModel> consolidateItemList = item.Value;
                DataTable dt = new DataTable();
                dt.Columns.Add(new DataColumn("Item Code", typeof(string)));
                dt.Columns.Add(new DataColumn("item Category", typeof(string)));
                dt.Columns.Add(new DataColumn("Decription", typeof(string)));
                dt.Columns.Add(new DataColumn("UOM", typeof(string)));
                dt.Columns.Add(new DataColumn("Quantity", typeof(Int32)));


                foreach (ItemInfobyReqiIdModel itemList in consolidateItemList)
                {
                    string  itemCode     = itemList.ItemCode1;
                    string  itemCategory = control.GetItemCategoryByitemId(itemCode);
                    string  Desc         = control.GetItemDescByitemId(itemCode);
                    string  UOM          = control.GetItemUomByitemId(itemCode);
                    int     quantity     = itemList.Item_assigned1;
                    DataRow dr           = dt.NewRow();
                    dr["Item Code"]     = itemCode;
                    dr["item Category"] = control.GetItemCategoryByitemId(itemCode);
                    dr["Decription"]    = control.GetItemDescByitemId(itemCode);
                    dr["UOM"]           = control.GetItemUomByitemId(itemCode);
                    dr["Quantity"]      = quantity;
                    itemCodeDic.Add(itemCode, quantity);
                    dt.Rows.Add(dr);
                }

                string disbursementId = "D0" + getDisbursementId();

                Label lbl2 = new Label();
                lbl2.ForeColor = System.Drawing.Color.Black;
                lbl2.Font.Bold = true;
                lbl2.Font.Size = 12;
                lbl2.Text      = "Disbursment ID:  " + disbursementId;
                PlaceHolder1.Controls.Add(lbl2);
                PlaceHolder1.Controls.Add(new LiteralControl("<br />"));

                Label lbl1 = new Label();
                lbl1.ForeColor = System.Drawing.Color.Black;
                lbl1.Font.Bold = true;
                lbl1.Font.Size = 12;
                lbl1.Text      = "Department Name:  " + deptName;
                PlaceHolder1.Controls.Add(lbl1);
                GridView gv = new GridView();
                gv.AutoGenerateColumns = true;
                gv.DataSource          = dt;
                gv.DataBind();
                gv.Attributes.Add("Class", "table table-striped table-bordered table-hover dataTable no-footer");
                gv.Width = 800;
                PlaceHolder1.Controls.Add(gv);
                Panel1.Visible = true;

                if (disbursementId == s)
                {
                    disbursementId = "D0" + (Convert.ToInt64(disbursementId.Substring(2)) + 1).ToString();
                }
                List <string> reqIdByDept = new List <string>();
                selectedReqIdsList = (List <string>)Session["selectedReqIdsList"];
                foreach (string reqId in selectedReqIdsList)
                {
                    string depname = control.GetDepName(reqId);
                    if (depname == deptName)
                    {
                        reqIdByDept.Add(reqId);
                    }
                }
                Disbursement disbursement = new Disbursement();
                disbursement.Disbursement_ID = disbursementId;
                disbursement.Create_Date     = DateTime.Now;
                disbursement.Receive_Date    = null;
                disbursement.Dept_ID         = control.getDeptIdByDeptName(deptName);
                disbursement.RepStaff_ID     = control.getRepStaffId(disbursement.Dept_ID);
                disbursement.Status          = "Submitted";
                control.CreateDisburseList(reqIdByDept, itemCodeDic, disbursement);     //for each dept disbursement
                s = disbursementId;
            }

            showDisbursementBtn.Enabled = false;
            // requisitionSummaryView.
            //  showDisbursementBtn.ForeColor

            // setInitialData();
        }