public async System.Threading.Tasks.Task <ActionResult> Delete(int id)
        {
            Tickets ticket       = db.Tickets.Find(id);
            var     strLoginUser = User.Identity.GetUserId();

            //Sends Ticket staus change to history audit log
            HistoryHelper audit = new HistoryHelper();

            audit.AddHistory(ticket.Id, "Status", ticket.TicketStatus.Name, "Resolved", strLoginUser);

            //Updates Status to Closed in the ticket table
            ticket.TicketStatusId = 4;
            var developer = db.Users.Find(ticket.AssignedToUserId);

            if (developer != null && developer.Email != null)
            {
                var svc = new EmailService();
                var msg = new IdentityMessage();
                msg.Destination = developer.Email;
                msg.Subject     = "Bug Tracker Update: " + ticket.Title;
                msg.Body        = ("Ticket ID: " + ticket.Id + " - " + ticket.Title + "has been resolved");
                await svc.SendAsync(msg);
            }

            db.Tickets.Attach(ticket);
            db.Entry(ticket).Property("TicketStatusId").IsModified = true;
            db.SaveChanges();

            return(RedirectToAction("Index", new { id = ticket.Id }));
        }
        public async Task <ActionResult> Edit([Bind(Include = "Id,ProjectId,TicketTypeId,TicketStatusId,TicketPriorityId,Progress,OwnerUserId,AssignedToUserId,AssignedToUserTwoId,Title,Description,Created,Updated")] Ticket ticket)
        {
            if (ModelState.IsValid)
            {
                //Get a reference to the Old Ticket
                var oldTicket = db.Tickets.AsNoTracking().FirstOrDefault(t => t.Id == ticket.Id);
                //Compare it to the incoming Ticket(ticket)

                ticket.OwnerUserId     = User.Identity.GetUserId();
                ticket.Updated         = DateTime.Now;
                db.Entry(ticket).State = EntityState.Modified;
                db.SaveChanges();

                await notificationHelper.Notify(oldTicket, ticket);

                historyHelper.AddHistory(oldTicket, ticket);

                return(RedirectToAction("Index", "Home"));
            }


            var userId     = User.Identity.GetUserId();
            var tAssigned  = roleHelper.UsersInRole("Developer");
            var myProjects = projHelper.ListUserProjects(userId);
            var myTickets  = tickHelper.ListUserTickets();


            ViewBag.Id = new SelectList(myTickets, "Id", "FirstName", ticket.Id);
            ViewBag.AssignedToUserId = new SelectList(tAssigned, "Id", "FirstName", ticket.AssignedToUserId);
            ViewBag.OwnerUserId      = new SelectList(db.Users, "Id", "FirstName", ticket.OwnerUserId);
            ViewBag.ProjectId        = new SelectList(myProjects, "Id", "Name", ticket.ProjectId);
            ViewBag.TicketPriorityId = new SelectList(db.TicketPriorities, "Id", "Name", ticket.TicketPriorityId);
            ViewBag.TicketStatusId   = new SelectList(db.TicketStatuses, "Id", "Name", ticket.TicketStatusId);
            ViewBag.TicketTypeId     = new SelectList(db.TicketTypes, "Id", "Name", ticket.TicketTypeId);
            return(View(ticket));
        }
        public async Task <ActionResult> Assign([Bind(Include = "Id,AssignedToUserId,Created,OwnerUserId,Title,Description,ProjectId,TicketTypeId,TicketStatusId,TicketPrioritiesId")] Tickets tickets)

        {
            HistoryHelper historyHelper = new HistoryHelper();

            StringBuilder updateMessage = new StringBuilder();

            var oldTicketInfo = db.Tickets.AsNoTracking().FirstOrDefault(t => t.Id == tickets.Id);

            if (oldTicketInfo.AssignedToUserId != tickets.AssignedToUserId &&
                oldTicketInfo.AssignedToUserId != null)
            {
                var oldAssignedUser  = db.Users.Find(oldTicketInfo.AssignedToUserId).FirstName + " " + db.Users.Find(tickets.AssignedToUserId).LastName;
                var newAssignedUser2 = db.Users.Find(tickets.AssignedToUserId).FirstName + " " + db.Users.Find(tickets.AssignedToUserId).LastName;
                historyHelper.AddHistory(tickets.Id, "Assigned User", oldAssignedUser, newAssignedUser2, User.Identity.GetUserId());
                updateMessage.AppendFormat("Assigned User: {0}, ", newAssignedUser2);
            }

            if (oldTicketInfo.AssignedToUserId == null && oldTicketInfo.AssignedToUserId != tickets.AssignedToUserId)
            {
                var oldAssignedUser  = "******";
                var newAssignedUser3 = db.Users.Find(tickets.AssignedToUserId).FirstName + " " + db.Users.Find(tickets.AssignedToUserId).LastName;
                historyHelper.AddHistory(tickets.Id, "Assigned User", oldAssignedUser, newAssignedUser3, User.Identity.GetUserId());
                updateMessage.AppendFormat("Assigned User: {0}, ", newAssignedUser3);
            }
            //Send Notification
            var developer = db.Users.Find(tickets.AssignedToUserId);

            if (developer != null && developer.Email != null)
            {
                var svc = new EmailService();
                var msg = new IdentityMessage();
                msg.Destination = developer.Email;
                msg.Subject     = "Bug Tracker Update: " + tickets.Title + " Assigned";
                msg.Body        = ("The following Ticket ID: " + tickets.Id + " - " + tickets.Title + ": " + updateMessage);
                await svc.SendAsync(msg);
            }



            TicketHistories ticketHistory   = new TicketHistories();
            var             old             = TempData["oldVal"];
            var             owner           = TempData["owner"];
            var             newAssignedUser = db.Users.Find(tickets.AssignedToUserId).FirstName;

            if (ModelState.IsValid)
            {
                ticketHistory.TicketId   = tickets.Id;
                ticketHistory.Property   = "Ticket Assigned";
                ticketHistory.OldValue   = old.ToString();
                ticketHistory.NewValue   = newAssignedUser;
                ticketHistory.UserId     = tickets.OwnerUserId;
                ticketHistory.ChangeDate = tickets.Created;
                ticketHistory.Changed    = true;

                db.TicketHistories.Add(ticketHistory);
                //db.SaveChanges();

                tickets.Updated         = DateTime.Now;
                tickets.OwnerUserId     = owner.ToString();
                tickets.TicketStatusId  = 2;
                db.Entry(tickets).State = EntityState.Modified;
                db.SaveChanges();
                return(RedirectToAction("Index"));
            }
            ViewBag.AssignedToUserId   = new SelectList(db.Users, "Id", "FirstName", tickets.AssignedToUserId);
            ViewBag.OwnerUserId        = new SelectList(db.Users, "Id", "FirstName", tickets.OwnerUserId);
            ViewBag.ProjectId          = new SelectList(db.Projects, "Id", "Name", tickets.ProjectId);
            ViewBag.TicketPrioritiesId = new SelectList(db.TicketPriorities, "Id", "Name", tickets.TicketPrioritiesId);
            ViewBag.TicketStatusId     = new SelectList(db.TicketStatuses, "Id", "Name", tickets.TicketStatusId);
            ViewBag.TicketTypeId       = new SelectList(db.TicketTypes, "Id", "Name", tickets.TicketTypeId);
            return(View(tickets));
        }
        public async Task <ActionResult> Edit([Bind(Include = "Id,Title,Description,Created,Updated,ProjectId,TicketTypeId,TicketPrioritiesId,TicketStatusId,OwnerUserID, AssignedToUserId")] Tickets tickets)
        {
            if (ModelState.IsValid)
            {
                //TicketHistories ticketHistory = new TicketHistories();
                HistoryHelper historyHelper = new HistoryHelper();

                StringBuilder updateMessage = new StringBuilder();

                //Old vs new data
                var oldTicketInfo = db.Tickets.AsNoTracking().FirstOrDefault(t => t.Id == tickets.Id);

                if (oldTicketInfo.Title != tickets.Title)
                {
                    historyHelper.AddHistory(tickets.Id, "Title", oldTicketInfo.Title, tickets.Title, User.Identity.GetUserId());
                    updateMessage.AppendFormat("Ticket Title: {0}, ", tickets.Title);
                }

                if (oldTicketInfo.Description != tickets.Description)
                {
                    historyHelper.AddHistory(tickets.Id, "Description", oldTicketInfo.Description, tickets.Description, User.Identity.GetUserId());
                    updateMessage.AppendFormat("Description: {0}, ", tickets.Description);
                }

                if (oldTicketInfo.TicketTypeId != tickets.TicketTypeId)
                {
                    var oldTicketType = db.TicketTypes.Find(oldTicketInfo.TicketTypeId).Name;
                    var newTicketType = db.TicketTypes.Find(tickets.TicketTypeId).Name;
                    historyHelper.AddHistory(tickets.Id, "Ticket Type", oldTicketType, newTicketType, User.Identity.GetUserId());
                    updateMessage.AppendFormat("Ticket Type: {0}, ", newTicketType);
                }

                if (oldTicketInfo.ProjectId != tickets.ProjectId)
                {
                    var oldProject = db.Projects.Find(oldTicketInfo.ProjectId).Name;
                    var newProject = db.Projects.Find(tickets.ProjectId).Name;
                    historyHelper.AddHistory(tickets.Id, "Project Id", oldProject, newProject, User.Identity.GetUserId());
                    updateMessage.AppendFormat("Project: {0}, ", newProject);
                }

                if (oldTicketInfo.TicketPrioritiesId != tickets.TicketPrioritiesId)
                {
                    var oldPriority = db.TicketPriorities.Find(oldTicketInfo.TicketPrioritiesId).Name;
                    var newPriority = db.TicketPriorities.Find(tickets.TicketPrioritiesId).Name;
                    historyHelper.AddHistory(tickets.Id, "Priority", oldPriority, newPriority, User.Identity.GetUserId());
                    updateMessage.AppendFormat("Ticket Priority: {0}, ", newPriority);
                }

                if (oldTicketInfo.TicketStatusId != tickets.TicketStatusId)
                {
                    var oldStatus = db.TicketStatuses.Find(oldTicketInfo.TicketStatusId).Name;
                    var newStatus = db.TicketStatuses.Find(tickets.TicketStatusId).Name;
                    historyHelper.AddHistory(tickets.Id, "Ticket Status", oldStatus, newStatus, User.Identity.GetUserId());
                    updateMessage.AppendFormat("Ticket Status: {0}, ", newStatus);
                }

                if (oldTicketInfo.AssignedToUserId != tickets.AssignedToUserId &&
                    oldTicketInfo.AssignedToUserId != null)
                {
                    var oldAssignedUser = db.Users.Find(oldTicketInfo.AssignedToUserId).FirstName + " " + db.Users.Find(tickets.AssignedToUserId).LastName;
                    var newAssignedUser = db.Users.Find(tickets.AssignedToUserId).FirstName + " " + db.Users.Find(tickets.AssignedToUserId).LastName;
                    historyHelper.AddHistory(tickets.Id, "Assigned User", oldAssignedUser, newAssignedUser, User.Identity.GetUserId());
                    updateMessage.AppendFormat("Assigned User: {0}, ", newAssignedUser);
                }

                if (oldTicketInfo.AssignedToUserId == null && oldTicketInfo.AssignedToUserId != tickets.AssignedToUserId)
                {
                    var oldAssignedUser = "******";
                    var newAssignedUser = db.Users.Find(tickets.AssignedToUserId).FirstName + " " + db.Users.Find(tickets.AssignedToUserId).LastName;
                    historyHelper.AddHistory(tickets.Id, "Assigned User", oldAssignedUser, newAssignedUser, User.Identity.GetUserId());
                    updateMessage.AppendFormat("Assigned User: {0}, ", newAssignedUser);
                }

                tickets.Updated = DateTime.Now;
                if (tickets.TicketStatusId == 1)
                {
                    tickets.AssignedToUserId = null;
                }
                db.Entry(tickets).State = EntityState.Modified;
                db.SaveChanges();

                //Send Notification
                var developer = db.Users.Find(tickets.AssignedToUserId);
                if (developer != null && developer.Email != null)
                {
                    var svc = new EmailService();
                    var msg = new IdentityMessage();
                    msg.Destination = developer.Email;
                    msg.Subject     = "Bug Tracker Update: " + tickets.Title;
                    msg.Body        = ("The following changes have been made to Ticket ID: " + tickets.Id + " - " + tickets.Title + ": " + updateMessage);
                    await svc.SendAsync(msg);
                }

                {
                    return(RedirectToAction("Index"));
                }
            }
            ViewBag.AssignedToUserId = new SelectList(db.Users, "Id", "FirstName", tickets.AssignedToUserId);
            ViewBag.OwnerUserId      = new SelectList(db.Users, "Id", "FirstName", tickets.OwnerUserId);
            ViewBag.ProjectId        = new SelectList(db.Projects, "Id", "Name", tickets.ProjectId);
            ViewBag.TicketPriorityId = new SelectList(db.TicketPriorities, "Id", "Name", tickets.TicketPrioritiesId);
            ViewBag.TicketStatusId   = new SelectList(db.TicketStatuses, "Id", "Name", tickets.TicketStatusId);
            ViewBag.TicketTypeId     = new SelectList(db.TicketTypes, "Id", "Name", tickets.TicketTypeId);
            return(View(tickets));
        }
        public async Task <ActionResult> Edit([Bind(Include = "Id,title,description,Created,Updated,ProjectId,TicketPriorityId,TicketStatusId,TicketTypeId,OwnerUserId,AssignedToUserId")] Ticket ticket)
        {
            if (ModelState.IsValid)
            {
                // begin update history section
                var oldTicketInfo = db.Tickets.AsNoTracking().FirstOrDefault(t => t.Id == ticket.Id);

                string notificationString = ""; // string to hold notifications

                // update db
                ticket.Updated = DateTime.Now;
                if (ticket.TicketStatusId == 1)
                {
                    ticket.AssignedToUserId = null;
                }


                if (oldTicketInfo.title != ticket.title)
                {
                    historyHelper.AddHistory(ticket.Id, "Title", oldTicketInfo.title, ticket.title, User.Identity.GetUserId());
                    sb.AppendFormat("Ticket Title: changed from {0} to {1} <br />", oldTicketInfo.title, ticket.title);
                }

                if (oldTicketInfo.description != ticket.description)
                {
                    historyHelper.AddHistory(ticket.Id, "Description", oldTicketInfo.description, ticket.description, User.Identity.GetUserId());
                    sb.AppendFormat("Description: changed from {0} to {1} <br />", oldTicketInfo.description, ticket.description);
                }

                if (oldTicketInfo.AssignedToUserId != ticket.AssignedToUserId &&
                    oldTicketInfo.AssignedToUserId != null)
                {
                    var oldAssignedUser = db.Users.Find(oldTicketInfo.AssignedToUserId).FirstName
                                          + " " + db.Users.Find(ticket.AssignedToUserId).LastName;
                    var newAssignedUser = db.Users.Find(ticket.AssignedToUserId).FirstName
                                          + " " + db.Users.Find(ticket.AssignedToUserId).LastName;
                    historyHelper.AddHistory(ticket.Id, "Assigned User", oldAssignedUser, newAssignedUser, User.Identity.GetUserId());
                }

                if (oldTicketInfo.AssignedToUserId == null && oldTicketInfo.AssignedToUserId != ticket.AssignedToUserId)
                {
                    var oldAssignedUser = "******";
                    var newAssignedUser = db.Users.Find(ticket.AssignedToUserId).FirstName
                                          + " " + db.Users.Find(ticket.AssignedToUserId).LastName;
                    historyHelper.AddHistory(ticket.Id, "Assigned User", oldAssignedUser, newAssignedUser, User.Identity.GetUserId());
                }

                if (oldTicketInfo.ProjectId != ticket.ProjectId)
                {
                    var oldProject = db.Projects.Find(oldTicketInfo.ProjectId).Name;
                    var newProject = db.Projects.Find(ticket.ProjectId).Name;
                    historyHelper.AddHistory(ticket.Id, "Project", oldProject, newProject, User.Identity.GetUserId());
                    sb.AppendFormat("Project: changed from {0} to {1} <br />", oldProject, newProject);
                }

                if (oldTicketInfo.TicketPriorityId != ticket.TicketPriorityId)
                {
                    var oldPriority = db.TicketPriorities.Find(oldTicketInfo.TicketPriorityId).Name;
                    var newPriority = db.TicketPriorities.Find(ticket.TicketPriorityId).Name;
                    historyHelper.AddHistory(ticket.Id, "Priority", oldPriority, newPriority, User.Identity.GetUserId());
                    sb.AppendFormat("Priority: changed from {0} to {1} <br />", oldPriority, newPriority);
                }

                if (oldTicketInfo.TicketStatusId != ticket.TicketStatusId)
                {
                    var oldStatus = db.TicketStatuses.Find(oldTicketInfo.TicketStatusId).Name;
                    var newStatus = db.TicketStatuses.Find(ticket.TicketStatusId).Name;
                    historyHelper.AddHistory(ticket.Id, "Status", oldStatus, newStatus, User.Identity.GetUserId());
                    sb.AppendFormat("Status: changed from {0} to {1} <br />", oldStatus, newStatus);
                }

                if (oldTicketInfo.TicketTypeId != ticket.TicketTypeId)
                {
                    var oldTicketType = db.TicketTypes.Find(oldTicketInfo.TicketTypeId).Name;
                    var newTicketType = db.TicketTypes.Find(ticket.TicketTypeId).Name;
                    historyHelper.AddHistory(ticket.Id, "Ticket Type", oldTicketType, newTicketType, User.Identity.GetUserId());
                    sb.AppendFormat("Type: changed from {0} to {1} <br />", oldTicketType, newTicketType);
                }


                db.Tickets.Attach(ticket);
                db.Entry(ticket).Property("title").IsModified            = true;
                db.Entry(ticket).Property("description").IsModified      = true;
                db.Entry(ticket).Property("Created").IsModified          = false;
                db.Entry(ticket).Property("Updated").IsModified          = true;
                db.Entry(ticket).Property("ProjectId").IsModified        = true;
                db.Entry(ticket).Property("TicketPriorityId").IsModified = true;
                db.Entry(ticket).Property("TicketStatusId").IsModified   = false;
                db.Entry(ticket).Property("TicketTypeId").IsModified     = true;
                db.Entry(ticket).Property("OwnerUserId").IsModified      = false;
                db.Entry(ticket).Property("AssignedToUserId").IsModified = false;
                db.SaveChanges();

                // notification
                var assignedUserId = ticket.AssignedToUserId;
                var editor         = db.Users.Find(User.Identity.GetUserId()).FirstName + " " + db.Users.Find(User.Identity.GetUserId()).LastName;
                if (assignedUserId != null)
                {
                    await notificationHelper.EditNotification(ticket.Id, assignedUserId, sb, editor);
                }

                return(RedirectToAction("Details", "Tickets", new { id = ticket.Id }));
            }

            return(View(ticket));
        }