public ActionResult GetDisbursements(int?clientId, int?productId, int?requestType, int?requestStatus, string start, string end)
        {
            try
            {
                #region Client Product productItem Session Check

                var userClientSession = (AppSession)Session["_UserClientSession_"];
                if (userClientSession == null || userClientSession.ClientId < 1 || userClientSession.ProductId < 1 || userClientSession.ProductItemId < 1)
                {
                    return(RedirectToAction("Index", "Dashboard"));
                }
                var ClientId      = clientId ?? userClientSession.ClientId;
                var ProductId     = productId ?? userClientSession.ProductId;
                var ProductItemId = userClientSession.ProductItemId;

                #endregion

                #region Current Session Check

                var userData = MvcApplication.GetUserData(User.Identity.Name);
                if (userData == null || userData.UserId < 1)
                {
                    ViewBag.Error = "Session Has Expired! Please Re-Login";
                    return(View(new List <DisbursementObj>()));
                }


                #endregion

                DateTime dateTimeStart = Convert.ToDateTime(start);
                DateTime dateTimeEnd   = Convert.ToDateTime(end + " 23:59:59 PM");

                List <DisbursementObj> disbursement = null;
                if (Session["_DisbursementList_"] is List <DisbursementObj> Disbursement && Disbursement.Any())
                {
                    #region check if department session is empty else get from service

                    if (Session["_DepartmentList_"] is List <DepartmentObj> DeptsList && DeptsList.Any())
                    {
                        Session["_DepartmentList_"] = DeptsList;
                    }
                    else
                    {
                        var searchObj3 = new DepartmentSearchObj
                        {
                            AdminUserId  = userData.UserId,
                            DepartmentId = 0,
                            Status       = -2,
                            StopDate     = "",
                            StartDate    = ""
                        };
                        var retValForDepartment = ExpenseLookUpServices.LoadDepartments(searchObj3, userData.Username);
                        var Depts = retValForDepartment.Departments.OrderBy(m => m.DepartmentId).ToList();
                        Session["_DepartmentList_"] = Depts;
                    }

                    #endregion

                    if (start != null && (start.Length > 0 || !string.IsNullOrEmpty(start) || start != "") || end != null && (end.Length > 0 || !string.IsNullOrEmpty(end) || end != ""))
                    {
                        disbursement = Disbursement.Where(m =>
                                                          Convert.ToDateTime(m.ApprovalDate.Replace('-', ' ').Trim()) >= dateTimeStart &&
                                                          Convert.ToDateTime(m.ApprovalDate.Replace('-', ' ').Trim()) <= dateTimeEnd).ToList();

                        if (requestType != 0)
                        {
                            disbursement = disbursement.Where(m => m.RequestType == requestType).ToList();
                        }
                        if (requestStatus >= -100)
                        {
                            disbursement = disbursement.Where(m => m.Status == requestStatus).ToList();
                        }

                        var disbursementList = disbursement.Where(m => m.ClientId == ClientId && m.ProductId == ProductId).ToList();
                        ViewBag.GrandTotal = Disbursement.Where(x => x.ClientId == ClientId && x.ProductId == ProductId).Sum(x => x.AmountDisbursed);
                        ViewBag.PageSum    = disbursementList.Sum(x => x.AmountDisbursed);
                        return(View(disbursementList));
                    }
                }

                #region request and response validations

                var searchObj = new DisbursementSearchObj
                {
                    AdminUserId    = userData.UserId,
                    DisbursementId = 0,
                    Status         = requestStatus ?? -1000,
                };
                var retVal = DisbursementServices.LoadDisbursements(searchObj, userData.Username);

                if (retVal?.Status == null)
                {
                    ViewBag.Error = " Disbursement list is empty!";
                    return(View(new List <DisbursementObj>()));
                }

                if (!retVal.Status.IsSuccessful)
                {
                    ViewBag.Error = string.IsNullOrEmpty(retVal.Status.Message.FriendlyMessage)
                        ? "  Disbursement list is empty!"
                        : retVal.Status.Message.FriendlyMessage;
                    return(View(new List <DisbursementObj>()));
                }
                if (retVal.Disbursements == null || !retVal.Disbursements.Any())
                {
                    ViewBag.Error = " Disbursement list is empty!";
                    return(View(new List <DisbursementObj>()));
                }

                #endregion

                var Disbursements = retVal.Disbursements.OrderBy(m => m.DisbursementId).ToList();//.Where(m => ).ToList();
                Session["_DisbursementList_"] = Disbursements.Where(m => m.ClientId == ClientId && m.ProductId == ProductId).ToList();
                return(View(new List <DisbursementObj>()));
            }
            catch (Exception ex)
            {
                ViewBag.Error = ex.Message;
                UtilTools.LogE(ex.StackTrace, ex.Source, ex.Message);
                return(View(new List <DisbursementObj>()));
            }
        }