public async Task <IActionResult> Create([Bind("Id,Email,CompanyToken,InviteDate,IsValid,CompanyId,InvitorId,InviteeId")] Invite invite, string CompanyName, string Role, int projectId)
        {
            if (!(await _roleService.IsUserInRoleAsync(await _userManager.GetUserAsync(User), Roles.DemoUser.ToString())))
            {
                if (ModelState.IsValid)
                {
                    var     loginUser = (await _userManager.GetUserAsync(User));
                    Company company   = new Company();
                    if (await _userManager.IsInRoleAsync(loginUser, Roles.Admin.ToString()))
                    {
                        company = new Company
                        {
                            Name        = CompanyName,
                            Description = $"This is a temporary description for Company: {CompanyName}, you can change this description anytime."
                        };
                        await _context.Company.AddAsync(company);

                        await _context.SaveChangesAsync();
                    }
                    else
                    {
                        company = await _context.Company.FirstOrDefaultAsync(c => c.Id == loginUser.CompanyId);
                    }

                    invite.CompanyToken = Guid.NewGuid();
                    invite.CompanyId    = company.Id;
                    var        number_of_user_on_system = _context.Users.ToList().Count + 1;
                    CustomUser newUser = new CustomUser
                    {
                        FirstName      = "Invite",
                        LastName       = $"User #{number_of_user_on_system}",
                        UserName       = invite.Email,
                        Email          = invite.Email,
                        EmailConfirmed = true,
                        CompanyId      = company.Id
                    };
                    try
                    {
                        var newUserFind = await _userManager.FindByEmailAsync(newUser.Email);

                        if (newUserFind == null)
                        {
                            var result = await _userManager.CreateAsync(newUser, "Abc123!");

                            if (result.Succeeded)
                            {
                                string returnUrl = null;
                                returnUrl ??= Url.Content("~/");
                                var code        = invite.CompanyToken;
                                var callbackUrl = Url.Action(
                                    "AcceptInvite",
                                    "Tickets",
                                    values: new { userId = newUser.Id, code },
                                    protocol: Request.Scheme);

                                await _emailSender.SendEmailAsync(newUser.Email, "Invite Email From Lan's Bug Tracker",
                                                                  $"<h1>You received a invite ticket from Lan's Bug Tracker</h1> <br> <a style='background-color: #555555;border: none;color: white;padding: 15px 32px;text-align: center;text-decoration: none;display: inline-block;font-size: 16px;' href='{HtmlEncoder.Default.Encode(callbackUrl)}'>Clicking here to join our software.</a>  <br> <h3>Your UserName is: {newUser.Email} </h3><br> <h3>Your Password is: Abc123!</h3>");

                                if (await _userManager.IsInRoleAsync(loginUser, Roles.Admin.ToString()))
                                {
                                    await _userManager.AddToRoleAsync(newUser, Roles.ProjectManager.ToString());
                                }
                                else if (await _userManager.IsInRoleAsync(loginUser, Roles.ProjectManager.ToString()))
                                {
                                    await _userManager.AddToRoleAsync(newUser, _context.Roles.FirstOrDefault(r => r.Id == Role).Name);
                                }
                                else
                                {
                                    await _userManager.AddToRoleAsync(newUser, Roles.NewUser.ToString());
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine("*************  ERROR  *************");
                        Debug.WriteLine("Error Create User For Invite Ticket.");
                        Debug.WriteLine(ex.Message);
                        Debug.WriteLine("***********************************");
                        throw;
                    }
                    var admin = await _userManager.FindByEmailAsync("*****@*****.**");


                    if (await _userManager.IsInRoleAsync(loginUser, Roles.Admin.ToString()))
                    {
                        var     number_of_project_on_system = _context.Project.Count() + 1;
                        Project project = new Project
                        {
                            Name        = $"Project Example #{number_of_project_on_system}",
                            Description = $"This is your project Example #{number_of_project_on_system}, you can change anything in this project anytime you want",
                            Created     = DateTime.Now,
                            CompanyId   = company.Id
                        };
                        await _context.Project.AddAsync(project);

                        await _context.SaveChangesAsync();

                        await _projectService.AddUserToProjectAsync(newUser.Id, project.Id);
                    }
                    else if (await _userManager.IsInRoleAsync(loginUser, Roles.ProjectManager.ToString()))
                    {
                        if (projectId != 0)
                        {
                            if ((await _projectService.ProjectManagerOnProjectAsync(projectId)).Id == loginUser.Id)
                            {
                                await _projectService.AddUserToProjectAsync(newUser.Id, projectId);
                            }
                        }
                    }
                    if (!await _userManager.IsInRoleAsync(loginUser, Roles.Admin.ToString()))
                    {
                        string adminEmail = admin.Email;
                        string subject    = "New User Have Been Invited";
                        string message    = $"{loginUser.FullName} just send a Invite Ticket to {invite.Email}";

                        await _emailSender.SendEmailAsync(adminEmail, subject, message);

                        await _context.SaveChangesAsync();
                    }
                    //notification for new user
                    WelcomeNotification welcomenotification = new WelcomeNotification
                    {
                        Name        = "Welcome To The Bug Tracker",
                        Description = $"You have been Invited to the bug tracker service by {loginUser.FullName}. Your role is: {(await _roleService.ListUserRoleAsync(newUser)).First()}. Please contact our admin or project manager ({loginUser.FullName}) by the inbox system.Or, you can start create new ticket and start working on it. You can change your name in profile setting under your name in the vertical Nav bar.",
                        Created     = DateTime.Now,
                        SenderId    = (admin).Id,
                        RecipientId = newUser.Id
                    };
                    await _context.WelcomeNotification.AddAsync(welcomenotification);

                    await _context.SaveChangesAsync();

                    //noification for admin
                    WelcomeNotification welcomenotification2 = new WelcomeNotification
                    {
                        Name        = "New invite ticket has been sent",
                        Description = $"{loginUser.FullName} just send a Invite Ticket to {invite.Email}",
                        Created     = DateTime.Now,
                        SenderId    = (admin).Id,
                        RecipientId = (admin).Id
                    };
                    await _context.WelcomeNotification.AddAsync(welcomenotification2);

                    await _context.SaveChangesAsync();

                    //noification for person who send invite ticket
                    WelcomeNotification welcomenotification3 = new WelcomeNotification
                    {
                        Name        = "New invite ticket has been sent",
                        Description = $"You just send a Invite Ticket to {invite.Email}",
                        Created     = DateTime.Now,
                        SenderId    = (admin).Id,
                        RecipientId = loginUser.Id
                    };
                    await _context.WelcomeNotification.AddAsync(welcomenotification3);

                    await _context.SaveChangesAsync();

                    invite.InvitorId  = loginUser.Id;
                    invite.InviteeId  = newUser.Id;
                    invite.InviteDate = DateTime.Now;
                    invite.IsValid    = true;
                    _context.Add(invite);
                    await _context.SaveChangesAsync();

                    return(RedirectToAction("Index", "Home"));
                }
                return(RedirectToAction("Index", "Home"));
            }
            return(RedirectToAction("DemoUser", "Projects"));
        }
예제 #2
0
        public async Task <IActionResult> IndexAsync()
        {
            var currentTime = DateTime.Now;
            var role        = await _customRoleService.ListUserRoleAsync((await _userManager.GetUserAsync(User)));

            var userId   = (await _userManager.GetUserAsync(User)).Id;
            var projects = _dbContext.Project.ToList();


            var number_of_project       = projects.Count;
            var number_of_ticket        = _dbContext.Ticket.ToList().Count;
            var number_of_user          = _dbContext.Users.ToList().Count;
            var number_of_close_ticket  = _dbContext.Ticket.Where(t => t.StatusId == (_dbContext.Status.FirstOrDefault(t => t.Name == "Closed").Id)).ToList().Count;
            var persent_of_ticket_done  = number_of_close_ticket * 100 / number_of_ticket;
            var number_of_urgent_ticket = _dbContext.Ticket.Where(t => t.PriorityId == (_dbContext.Priority.FirstOrDefault(t => t.Name == "Urgent").Id)).ToList().Count;
            var number_unassign_ticket  = _dbContext.Ticket.Where(t => t.IsAssigned == false).ToList().Count;
            var number_new_ticket       = _dbContext.Ticket.Where(t => t.Created >= currentTime.AddDays(-7)).ToList().Count;
            var number_resolve_ticket   = _dbContext.Ticket.Where(t => t.Updated >= currentTime.AddDays(-7) && t.StatusId == (_dbContext.Status.FirstOrDefault(t => t.Name == "Closed").Id)).ToList().Count;
            var number_of_company       = _dbContext.Company.ToList().Count;

            ViewData["NumberOfTicket"]          = _dbContext.Ticket.OrderBy(t => t.Id).Last().Id + 1;
            ViewData["currentTime"]             = currentTime;
            ViewData["role"]                    = role;
            ViewData["userId"]                  = userId;
            ViewData["projects"]                = projects;
            ViewData["number_of_project"]       = number_of_project;
            ViewData["number_of_ticket"]        = number_of_ticket;
            ViewData["number_of_user"]          = number_of_user;
            ViewData["number_of_close_ticket"]  = number_of_close_ticket;
            ViewData["persent_of_ticket_done"]  = persent_of_ticket_done;
            ViewData["number_of_urgent_ticket"] = number_of_urgent_ticket;
            ViewData["number_unassign_ticket"]  = number_unassign_ticket;
            ViewData["number_new_ticket"]       = number_new_ticket;
            ViewData["number_resolve_ticket"]   = number_resolve_ticket;
            ViewData["number_of_company"]       = number_of_company;

            IEnumerable <CustomUser> allDeveloper = new List <CustomUser>();
            var allProject = _dbContext.Project.ToList();

            List <Project> listProject = new List <Project>();

            if (!await _customRoleService.IsUserInRoleAsync(await _userManager.GetUserAsync(User), Roles.Admin.ToString()))
            {
                foreach (var item in allProject)
                {
                    var developer = await _projectService.DeveloperOnProjectAsync(item.Id);

                    allDeveloper = allDeveloper.Union(developer);

                    if (await _projectService.IsUserOnProjectAsync(userId, item.Id))
                    {
                        listProject.Add(item);
                    }
                }
            }
            else
            {
                listProject = _dbContext.Project.ToList();
            }

            var listRole = _dbContext.Roles.Where(r => (r.Name != Roles.Admin.ToString() &&
                                                        r.Name != Roles.ProjectManager.ToString() &&
                                                        r.Name != Roles.DemoUser.ToString()) &&
                                                  r.Name != Roles.NewUser.ToString()).ToList();



            ViewData["Roles"]        = new SelectList(listRole, "Id", "Name");
            ViewData["CompanyId"]    = new SelectList(_dbContext.Company, "Id", "Name");
            ViewData["DeveloperId"]  = new SelectList(allDeveloper, "Id", "FullName");
            ViewData["OwnnerId"]     = new SelectList(_dbContext.Users, "Id", "FullName");
            ViewData["PriorityId"]   = new SelectList(_dbContext.Priority, "Id", "Name");
            ViewData["ProjectId"]    = new SelectList(listProject, "Id", "Name");
            ViewData["StatusId"]     = new SelectList(_dbContext.Status, "Id", "Name");
            ViewData["TicketTypeId"] = new SelectList(_dbContext.TicketType, "Id", "Name");

            var ticket = await _dbContext.Ticket.Include(t => t.Developer).Include(t => t.Ownner).Include(t => t.Priority).Include(t => t.Project).Include(t => t.Status).Include(t => t.TicketType).OrderByDescending(c => c.Created).ToListAsync();


            if (await _userManager.IsInRoleAsync(await _userManager.GetUserAsync(User), Roles.Admin.ToString()))
            {
                return(View(ticket));
            }
            else if (await _userManager.IsInRoleAsync(await _userManager.GetUserAsync(User), Roles.ProjectManager.ToString()))
            {
                List <Project> listProjectOfProjectManager = new List <Project>();

                foreach (var item in allProject)
                {
                    if (await _projectService.IsUserOnProjectAsync(userId, item.Id))
                    {
                        listProjectOfProjectManager.Add(item);
                    }
                }
                List <Ticket> projectManagerView = new List <Ticket>();
                foreach (var item in listProjectOfProjectManager)
                {
                    foreach (var itemInTicket in ticket)
                    {
                        if (itemInTicket.ProjectId == item.Id)
                        {
                            projectManagerView.Add(itemInTicket);
                        }
                    }
                }
                return(View(projectManagerView));
            }
            else if (await _userManager.IsInRoleAsync(await _userManager.GetUserAsync(User), Roles.Submitter.ToString()))
            {
                var ticketsView = ticket.Where(u => u.OwnnerId == userId);
                return(View(ticketsView));
            }
            else
            {
                var ticketsView = ticket.Where(u => u.DeveloperId == userId);
                return(View(ticketsView));
            }
        }