Beispiel #1
0
        public ActionResult Index()
        {
            HomePMViewModel model = _pmControllerBusiness.InitHomePMViewModel();

            return(View("Index", model));
        }
        public async Task <IActionResult> Index()
        {
            var user = await _userManager.GetUserAsync(User);

            var vm      = new HomePMViewModel();
            var tickets = await _context.Tickets
                          .Include(t => t.DeveloperUser)
                          .Include(t => t.OwnerUser)
                          .Include(t => t.Project)
                          .Include(t => t.TicketPriority)
                          .Include(t => t.TicketStatus)
                          .Include(t => t.TicketType)
                          .Include(t => t.Comments).ThenInclude(tc => tc.User)
                          .Include(t => t.Attachments)
                          .Include(t => t.Notifications)
                          .Include(t => t.Histories).ThenInclude(h => h.User)
                          .ToListAsync();

            vm.numTickets     = tickets.Count;
            vm.numCritical    = tickets.Where(t => t.TicketPriority.Name == "Critical").ToList().Count;
            vm.numOpen        = tickets.Where(t => t.TicketStatus.Name == "Opened").ToList().Count;
            vm.numAssigned    = tickets.Where(t => t.DeveloperUserId != null).ToList().Count;
            vm.numUnassigned  = tickets.Where(t => t.DeveloperUserId == null).ToList().Count;
            vm.UsersOnProject = await _context.Users.ToListAsync();

            var notifications = new List <ICollection <Notification> >();

            foreach (var ticket in tickets)
            {
                notifications.Add(ticket.Notifications);
            }
            vm.Notifications = notifications.SelectMany(n => n)
                               .Where(n => n.RecipientId == user.Id)
                               .Where(n => n.Viewed == false)
                               .ToList();
            // give pm personalized data
            if (await _userManager.IsInRoleAsync(user, "ProjectManager"))
            {
                // all pm projects
                var projects = await _projectService.ListUserProjects(user.Id);

                // all users on all projects --> list of lists
                var users     = new List <ICollection <PSUser> >();
                var ticketSet = new List <List <Ticket> >();
                foreach (var project in projects)
                {
                    users.Add(await _projectService.UsersOnProject(project.Id));
                    ticketSet.Add(tickets.Where(t => t.Project.Id == project.Id).ToList());
                }
                // flatten list of lists
                tickets           = ticketSet.SelectMany(t => t).ToList();
                vm.UsersOnProject = users.SelectMany(u => u).Distinct().ToList();

                // remove users that are not developers
                List <PSUser> devs = new List <PSUser>();
                foreach (var flatuser in vm.UsersOnProject)
                {
                    if (await _rolesService.IsUserInRole(flatuser, "Developer"))
                    {
                        devs.Add(flatuser);
                    }
                }

                // reassign view model properties if you're a pm
                vm.numTickets    = ticketSet.SelectMany(t => t).ToList().Count;
                vm.numCritical   = tickets.Where(t => t.TicketPriority.Name == "Critical").ToList().Count;
                vm.numUnassigned = tickets.Where(t => t.DeveloperUserId == null).ToList().Count;
                vm.numOpen       = tickets.Where(t => t.TicketStatus.Name == "Opened").ToList().Count;

                // if we have developers make suggestion
                if (devs.Count > 0)
                {
                    // maximum suggestions
                    var max = 5;
                    // minimum suggestions = number of tickets
                    var min = tickets.Where(t => t.DeveloperUserId == null).ToList().Count;
                    // if it's less than max
                    var num = min < max ? min : max;
                    for (var i = 0; i < num; i++)
                    {
                        // get ticket
                        var ticket = tickets.Where(t => t.DeveloperUserId == null)
                                     .OrderBy(t => t.TicketPriorityId).ThenBy(t => t.TicketStatusId)
                                     .Skip(i).Take(1).ToList()[0];
                        vm.Tickets.Add(ticket);

                        // get dev
                        //devs = _projectService.SortListOfDevsByTicketCountAsync(devs, tickets);
                        var dev = devs.Count > i ? devs[i] : devs[0];
                        vm.Developers.Add(devs[0]);
                        // get task count
                        vm.Count.Add(tickets.Where(t => t.DeveloperUserId == devs[0].Id).ToList().Count);
                    }
                }
            }

            // give developer personalized data
            if (await _userManager.IsInRoleAsync(user, "Developer"))
            {
                vm.Tickets = tickets;

                var projects = await _projectService.ListUserProjects(user.Id);

                var ticketSet = new List <List <Ticket> >();
                foreach (var project in projects)
                {
                    ticketSet.Add(tickets.Where(t => t.Project.Id == project.Id).ToList());
                }
                vm.TicketsOnDevProjs    = ticketSet.SelectMany(t => t).ToList();
                vm.TicketsAssignedToDev = vm.TicketsOnDevProjs.Where(t => t.DeveloperUserId == user.Id).ToList();
            }

            // give submitter personalized data
            if (await _userManager.IsInRoleAsync(user, "Submitter"))
            {
                vm.Tickets            = tickets;
                vm.TicketsCreatedByMe = tickets.Where(t => t.OwnerUserId == user.Id).ToList();
            }

            // give submitter personalized data
            if (await _userManager.IsInRoleAsync(user, "NewUser"))
            {
                vm.Tickets = tickets;
            }

            return(View(vm));
        }