public ActionResult Index()
        {
            try
            {
                List <UserTicketGeneration> userTicketGeneration = new List <UserTicketGeneration>();
                List <AssigneeTicket>       assigneeTicket       = new List <AssigneeTicket>();
                userTicketGeneration = _db.UserTicketGeneration.ToList();

                assigneeTicket = (from u in userTicketGeneration
                                  join at in _db.AssigneeTicket.AsNoTracking()
                                  on u.Id equals at.UserTicketGenerationId
                                  select at).ToList();


                var ticketsGrid = (from u in userTicketGeneration
                                   join at in _db.AssigneeTicket.AsNoTracking()
                                   on u.Id equals at.UserTicketGenerationId
                                   select new
                {
                    ticketId = u.Id,
                    ticketSubject = at.ticketSubject,
                    ticketType = at.ticketType,
                    ticketAssignee = HelperExtensions.GetUserNamebyID(u.UserId),
                    ticketStatus = at.Status?.statusName,
                    createdDate = u.createdDate,
                    openTime = DateTimeExtension.ConvertDateIntoString(u.createdDate),
                    resolveTime = DateTimeExtension.ConvertDateIntoString(at.closesCreatedDate),
                    inProgressTime = DateTimeExtension.ConvertDateIntoString(at.inProgressCreatedDate),
                    priority = at.ticketPriority,
                    createdBy = HelperExtensions.GetUserNamebyID(u.createdBy)
                }.ToExpando());
                var nonactivetickets = _db.UserTicketGeneration.Where(p => p.Status.statusName == ETicketStatus.OPEN).Select(p => p).ToList();
                ViewBag.pendingactive = nonactivetickets;
                // Dough Chart
                ViewBag.OpenTickets            = userTicketGeneration.Where(x => x.Status?.statusName == ETicketStatus.OPEN).Count();
                ViewBag.totalInProgressTickets = userTicketGeneration.Where(x => x.Status?.statusName == ETicketStatus.IN_PROGRESS).Count();
                ViewBag.totalResolveTickets    = userTicketGeneration.Where(x => x.Status?.statusName == ETicketStatus.RESOLVED).Count();
                ViewBag.totalUnResovleTickets  = userTicketGeneration.Where(x => x.Status?.statusName == ETicketStatus.UNRESOLVED).Count();

                // All Tickets
                ViewBag.ticketGrid = ticketsGrid;

                ViewBag.UserTicketGeneration      = userTicketGeneration;
                ViewBag.totalUserTicketGeneration = userTicketGeneration.Count();

                ViewBag.assigneeTicket      = assigneeTicket;
                ViewBag.totalAssigneeTicket = assigneeTicket.Count();

                // Charts Data
                ViewBag.totalgenratedticketsbyweek = GetTotalgeneratedTickets(userTicketGeneration);
                ViewBag.totalResoloveticketsbyweek = GetTotalResoloveTickets(userTicketGeneration);
                ViewBag.totalOverDueticketsbyweek  = GetTotalOverDueTickets(userTicketGeneration);
                ViewBag.TotalOpenTickets           = GetTotalOpenTickets(_db.UserTicketGeneration.ToList());
                ViewBag.TotalActiveTickets         = GetTotalActiveTickets(userTicketGeneration);



                //Tickets
                ViewBag.CardOpenTickets       = userTicketGeneration.Where(x => x.Status?.statusName == ETicketStatus.OPEN).Select(p => p);
                ViewBag.CardInProgressTickets = userTicketGeneration.Where(x => x.Status?.statusName == ETicketStatus.IN_PROGRESS).Select(p => p);
                ViewBag.CardResolveTickets    = userTicketGeneration.Where(x => x.Status?.statusName == ETicketStatus.RESOLVED).Select(p => p);


                //Highest time to resolve ticket
                var resolvetimeDouble = _db.AssigneeTicket.ToList().Count() > 0   ? _db.AssigneeTicket.ToList().Select(p => p.closeResoloutionTime): null;
                var highest           = resolvetimeDouble != null?resolvetimeDouble.Max() : 0;

                TimeSpan highestTime = TimeSpan.FromMinutes(highest);

                int?hdd = highestTime != null ? highestTime.Days : (int?)null;
                int?hhh = highestTime != null ? highestTime.Hours : (int?)null;
                int?hmm = highestTime != null ? highestTime.Minutes : (int?)null;
                int?hss = highestTime != null ? highestTime.Seconds : (int?)null;
                ViewBag.hdays    = hdd;
                ViewBag.hhours   = hhh;
                ViewBag.hminutes = hmm;
                ViewBag.hseconds = hss;

                //Average Time to resolve a ticket

                var avgminutesdouble = resolvetimeDouble != null?resolvetimeDouble.Average(p => p) : 0;

                TimeSpan averagetime = TimeSpan.FromMinutes(avgminutesdouble);
                int?     avgdd       = averagetime != null ? averagetime.Days : (int?)null;
                int?     avghh       = averagetime != null ? averagetime.Hours : (int?)null;
                int?     avgmm       = averagetime != null ? averagetime.Minutes : (int?)null;
                int?     avgss       = averagetime != null ? averagetime.Seconds : (int?)null;
                ViewBag.avgdays    = avgdd;
                ViewBag.avghours   = avghh;
                ViewBag.avgminutes = avgmm;
                ViewBag.avgseconds = avgss;



                //Average time in Progress
                var Progress             = _db.AssigneeTicket.ToList().Count() > 0 ? _db.AssigneeTicket.ToList().Select(p => p.inProgressWaitTime):null;
                var AvginProgressdoubles = Progress != null?Progress.Average(p => p) : 0;

                TimeSpan averageinprogresstime = TimeSpan.FromMinutes(AvginProgressdoubles);
                int?     pavgdd = averageinprogresstime != null ? averageinprogresstime.Days : (int?)null;
                int?     pavghh = averageinprogresstime != null ? averageinprogresstime.Hours : (int?)null;
                int?     pavgmm = averageinprogresstime != null ? averageinprogresstime.Minutes : (int?)null;
                int?     pavgss = averageinprogresstime != null ? averageinprogresstime.Seconds : (int?)null;
                ViewBag.waitingavgdays    = pavgdd;
                ViewBag.waitingavghours   = pavghh;
                ViewBag.waitingavgminutes = pavgmm;
                ViewBag.waitingavgseconds = pavgss;



                //highest time in Progress
                var HighProgressdoubles = Progress != null?Progress.Max() : 0;

                TimeSpan Highinprogresstime = TimeSpan.FromMinutes(HighProgressdoubles);
                int?     hwdd = Highinprogresstime != null ? Highinprogresstime.Days : (int?)null;
                int?     hwhh = Highinprogresstime != null ? Highinprogresstime.Hours : (int?)null;
                int?     hwmm = Highinprogresstime != null ? Highinprogresstime.Minutes : (int?)null;
                int?     hwss = Highinprogresstime != null ? Highinprogresstime.Seconds : (int?)null;
                ViewBag.waitinghdays    = hwdd;
                ViewBag.waitinghhours   = hwhh;
                ViewBag.waitinghminutes = hwmm;
                ViewBag.waitinghseconds = hwss;

                //  all tickets generated with Subject
                var subjectlabels = _db.TicketGeneration.Select(p => p).ToList();

                List <SubjectsViewModel> s = new List <SubjectsViewModel>();


                foreach (var item in subjectlabels)
                {
                    var res = _db.UserTicketGeneration.Where(p => p.TicketGeneration.subjectName == item.subjectName).Count();

                    SubjectsViewModel c = new SubjectsViewModel();
                    c.SubjectName = item.subjectName;
                    c.Count       = res;
                    s.Add(c);
                }


                ViewBag.subjects = s;
                List <SubjectsViewModel> s1 = new List <SubjectsViewModel>();

                //  all tickets generated with Resolution
                var resolutionlabels = _db.ticketResolution.Select(p => p).ToList();
                foreach (var item in resolutionlabels)
                {
                    var res             = _db.AssigneeTicket.Where(p => p.TicketResolutionId == item.id).Count();
                    SubjectsViewModel c = new SubjectsViewModel();
                    c.SubjectName = item.resolutionName;
                    c.Count       = res;
                    s1.Add(c);
                }
                ViewBag.resolution = s1;
            }
            catch (Exception ex)
            {
                TempData.Remove("AlertMessage");
                TempData.Add("AlertMessage", new AlertModel(ex.Message + "---------" + ex.StackTrace, AlertType.Error));
                AlertModel ar = (AlertModel)TempData["AlertMessage"];
                Session.Add("Alert", ar);
                HelperExtensions.LogError(User.Identity.GetUserName(), User.Identity.GetUserId(), ex.Message, ex.StackTrace);
                return(RedirectToAction("exception", "Error"));
            }
            return(View());
        }