// GET: SupportRequests/FinishRequest/5 public async Task <ActionResult> FinishRequest(int?id) { if (id == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } var supportRequest = await _db.SupportRequests.FindAsync(id); if (supportRequest == null) { return(HttpNotFound()); } var login = User.Identity.Name; var accountName = login.Substring(5, login.Length - 5); var person = _db.Persons.FirstOrDefault(p => p.AccountName == accountName); //request was not accepted or was accepted by other user if (supportRequest.State != 1 || supportRequest.To != person) { return(RedirectToAction("Index")); } var requestViewModel = new SupportRequestViewModel { Id = supportRequest.Id, Comment = supportRequest.Comment, SoftwareInstalled = supportRequest.SoftwareInstalled, SoftwareRemoved = supportRequest.SoftwareRemoved, SoftwareRepaired = supportRequest.SoftwareRepaired, SoftwareUpdated = supportRequest.SoftwareUpdated, OtherActions = supportRequest.OtherActions, From = supportRequest.From }; return(View("Finish", requestViewModel)); }
private async Task <List <SupportRequestViewModel> > GetSupportRequestsAsync(int pageNumber = 1, int take = _defaultTakeCount, int?assignedTo = null, string reason = null, int?issueStatusId = null) { if (pageNumber <= 0) { pageNumber = 1; } if (take < 1) { take = _defaultTakeCount; } var skip = (pageNumber - 1) * take; var galleryUsername = GetLoggedInUser(); var issues = _supportRequestService.GetIssues(assignedTo, reason, issueStatusId, galleryUsername).Where(i => i.CreatedBy != null); IEnumerable <Issue> pagedIssues = issues; if (skip > 0) { pagedIssues = issues.Skip(skip); } pagedIssues = pagedIssues.Take(take); var enumerable = pagedIssues as IList <Issue> ?? pagedIssues.ToList(); var distinctUserKeys = enumerable.Select(i => i.UserKey).Where(i => i.HasValue).Select(i => i.Value).Distinct().ToList(); var userEmails = await _userService.GetEmailAddressesForUserKeysAsync(distinctUserKeys); var results = new List <SupportRequestViewModel>(); foreach (var issue in enumerable) { var viewModel = new SupportRequestViewModel(issue); viewModel.AssignedToGalleryUsername = issue.AssignedTo?.GalleryUsername; viewModel.IssueStatusName = issue.IssueStatus.Name; // Email may not be available, because the delete workflow hard deletes unconfirmed users. if (issue.UserKey.HasValue && userEmails.ContainsKey(issue.UserKey.Value)) { viewModel.UserEmail = userEmails[issue.UserKey.Value]; } else { viewModel.UserEmail = string.Empty; } results.Add(viewModel); } return(results); }
// GET: /Manage/RequestSupport public ActionResult RequestSupport(int?personId, string request) { if (personId == null || !UserHelper.UserCanEditPerson(User, personId)) { return(HttpNotFound()); } var model = new SupportRequestViewModel { PersonId = personId.Value }; ViewBag.Request = request; return(PartialView("Request", model)); }
// GET: SupportRequests/Edit/5 public async Task <ActionResult> Edit(int?id) { if (id == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } var supportRequest = await _db.SupportRequests.FindAsync(id); if (supportRequest == null) { return(HttpNotFound()); } var requestViewModel = new SupportRequestViewModel { Id = supportRequest.Id, Category = supportRequest.Category, State = supportRequest.State }; //a user is editing his request if (!User.IsInRole(@"RIVS\IT-Dep")) { var login = User.Identity.Name; var accountName = login.Substring(5, login.Length - 5); var person = await _db.Persons.FirstOrDefaultAsync(p => p.AccountName == accountName); if (supportRequest.From != person) { return(HttpNotFound()); } requestViewModel.EditByIt = false; requestViewModel.Text = supportRequest.Text; requestViewModel.Mark = supportRequest.Mark.ToString(); requestViewModel.FeedBack = supportRequest.FeedBack; requestViewModel.Urgency = supportRequest.Urgency; return(View("EditByUser", requestViewModel)); } //support is editing a request requestViewModel.EditByIt = true; requestViewModel.Comment = supportRequest.Comment; requestViewModel.SoftwareInstalled = supportRequest.SoftwareInstalled; requestViewModel.SoftwareRemoved = supportRequest.SoftwareRemoved; requestViewModel.SoftwareRepaired = supportRequest.SoftwareRepaired; requestViewModel.SoftwareUpdated = supportRequest.SoftwareUpdated; requestViewModel.OtherActions = supportRequest.OtherActions; requestViewModel.ToId = supportRequest.To?.Id ?? 0; requestViewModel.From = supportRequest.From; return(View("EditByIt", requestViewModel)); }
private List <SupportRequestViewModel> GetSupportRequests(int pageNumber = 1, int take = 5, int?assignedTo = null, string reason = null, int?issueStatusId = null) { if (pageNumber <= 0) { pageNumber = 1; } if (take < 1) { take = 5; } var skip = (pageNumber - 1) * take; var issues = _supportRequestService.GetIssues(assignedTo, reason, issueStatusId); IEnumerable <Issue> pagedIssues = issues; if (skip > 0) { pagedIssues = issues.Skip(skip); } pagedIssues = pagedIssues.Take(take); var results = new List <SupportRequestViewModel>(); foreach (var issue in pagedIssues) { var viewModel = new SupportRequestViewModel(); viewModel.AssignedTo = issue.AssignedToId; viewModel.AssignedToGalleryUsername = issue.AssignedTo?.GalleryUsername; viewModel.IssueStatusId = issue.IssueStatusId; viewModel.IssueStatusName = issue.IssueStatus.Name; viewModel.Issue = issue; viewModel.Issue.SiteRoot = VerifyAndFixTrailingSlash(viewModel.Issue.SiteRoot); results.Add(viewModel); } return(results); }
public async Task <ActionResult> RequestSupport(SupportRequestViewModel model) { if (!ModelState.IsValid) { return(HttpNotFound()); } var person = Database.People.SingleOrDefault(p => p.Id == model.PersonId); if (person == null) { return(HttpNotFound()); } var subject = "Please add family members"; var emailBody = Utilities.FormatName(person) + " has requested that family members be added to the system. <br/><br/>" + "The family details are: <br/>" + model.Details + "<br/><br/>" + "Person record: " + Url.Action("Edit", "People", new { id = person.Id }, protocol: Request.Url?.Scheme) + "<br/><br/>"; await Utilities.AsyncSendEmail(UserHelper.GetAdminEmails(), subject, emailBody); return(RedirectToAction("Edit", "People", new { id = person.Id, success = true })); }
public async Task <ActionResult> FinishRequest(SupportRequestViewModel requestViewModel) { var login = User.Identity.Name; var accountName = login.Substring(5, login.Length - 5); var itPerson = await _db.Persons.FirstOrDefaultAsync(p => p.AccountName == accountName); if (!ModelState.IsValid || itPerson == null) { return(View("Finish", requestViewModel)); } if (!User.IsInRole(@"RIVS\IT-Dep")) { // return view with error message ModelState.AddModelError(string.Empty, "Ошибка авторизации!"); return(View("Finish", requestViewModel)); } var supportRequest = await _db.SupportRequests.FindAsync(requestViewModel.Id); if (supportRequest == null) { return(HttpNotFound()); } int hardwareId; int.TryParse(requestViewModel.HardwareId, out hardwareId); supportRequest.Comment = requestViewModel.Comment; supportRequest.SoftwareInstalled = requestViewModel.SoftwareInstalled; supportRequest.SoftwareRemoved = requestViewModel.SoftwareRemoved; supportRequest.SoftwareRepaired = requestViewModel.SoftwareRepaired; supportRequest.SoftwareUpdated = requestViewModel.SoftwareUpdated; supportRequest.HardwareId = hardwareId; supportRequest.HardwareQuantity = requestViewModel.HardwareQuantity > 0 && hardwareId > 0 ? requestViewModel.HardwareQuantity : 0; supportRequest.OtherActions = requestViewModel.OtherActions; supportRequest.State = 2; supportRequest.FinishTime = DateTime.Now; //grant selected hardware if (hardwareId > 0 && requestViewModel.HardwareQuantity > 0) { // find item in db var editItem = await _db.Items.FindAsync(hardwareId); if (editItem == null) { return(HttpNotFound()); } // check if we give more than we have if (editItem.Quantity < requestViewModel.HardwareQuantity) { // return view with error message ModelState.AddModelError(string.Empty, "Нельзя выдать больше, чем есть в наличии (" + editItem.Quantity + " шт.)!"); return(View("Finish", requestViewModel)); } // decrease item quantity editItem.Quantity -= requestViewModel.HardwareQuantity; // create new history item var newHistory = new History { Recieved = false, Date = DateTime.Now, Item = editItem, Quantity = requestViewModel.HardwareQuantity, WhoGave = itPerson, WhoTook = supportRequest.From }; // add new history item to db _db.Histories.Add(newHistory); // add new history item to modified item history list editItem.Histories.Add(newHistory); _db.Entry(editItem).State = EntityState.Modified; } _db.Entry(supportRequest).State = EntityState.Modified; await _db.SaveChangesAsync(); using (var mailer = new EmailController()) { //mail for user (job finished) var mail = await mailer.Finished(requestViewModel.Id); mail?.Deliver(); } return(RedirectToAction("Index")); }
public async Task <ActionResult> Edit(SupportRequestViewModel requestViewModel) { var started = false; var itUserChanged = false; var login = User.Identity.Name; var accountName = login.Substring(5, login.Length - 5); var person = await _db.Persons.FirstOrDefaultAsync(p => p.AccountName == accountName); if (person == null || !ModelState.IsValid) { // return view with error message if (person == null) { ModelState.AddModelError(string.Empty, "Ошибка авторизации!"); } return(View(requestViewModel.EditByIt ? "EditByIt" : "EditByUser", requestViewModel)); } var supportRequest = await _db.SupportRequests.FindAsync(requestViewModel.Id); if (supportRequest == null) { return(HttpNotFound()); } supportRequest.Category = requestViewModel.Category; //a file was attached if (requestViewModel.Upload != null && requestViewModel.Upload.ContentLength > 0) { if (requestViewModel.Upload.ContentLength > 10485760) { ModelState.AddModelError(string.Empty, "Файл должен быть меньше 10 МБ!"); return(View(requestViewModel.EditByIt ? "EditByIt" : "EditByUser", requestViewModel)); } var fileName = Path.GetFileName(requestViewModel.Upload.FileName); if (!string.IsNullOrEmpty(fileName)) { var dir = Directory.CreateDirectory(Path.Combine(HostingEnvironment.MapPath(@"~/SupportFiles"), Guid.NewGuid().ToString())); var filePath = Path.Combine(dir.FullName, fileName); requestViewModel.Upload.SaveAs(filePath); var requestFile = new SupportFile { Path = filePath }; _db.SupportFiles.Add(requestFile); supportRequest.File = requestFile; } } //edit by user if (!requestViewModel.EditByIt) { int mark; supportRequest.Text = requestViewModel.Text; supportRequest.Mark = int.TryParse(requestViewModel.Mark, out mark) ? mark : 0; if (supportRequest.State == 2 && supportRequest.Mark == 0) { requestViewModel.State = 2; ModelState.AddModelError(string.Empty, "Пожалуйста, выберите оценку"); return(View("EditByUser", requestViewModel)); } supportRequest.FeedBack = requestViewModel.FeedBack; supportRequest.Urgency = requestViewModel.Urgency; } //edit by IT-user else { if (requestViewModel.ToId != 0) { var itUser = await _db.Persons.FindAsync(requestViewModel.ToId); if (itUser != null) { //new request assigned to an IT-user - start it if (supportRequest.State == 0) { supportRequest.State = 1; supportRequest.StartTime = DateTime.Now; started = true; } else if (supportRequest.To != itUser) { itUserChanged = true; } supportRequest.To = itUser; } } supportRequest.Comment = requestViewModel.Comment; supportRequest.SoftwareInstalled = requestViewModel.SoftwareInstalled; supportRequest.SoftwareRemoved = requestViewModel.SoftwareRemoved; supportRequest.SoftwareRepaired = requestViewModel.SoftwareRepaired; supportRequest.SoftwareUpdated = requestViewModel.SoftwareUpdated; //supportRequest.HardwareId = requestViewModel.HardwareId; //supportRequest.HardwareReplaced = requestViewModel.HardwareReplaced; supportRequest.OtherActions = requestViewModel.OtherActions; } _db.Entry(supportRequest).State = EntityState.Modified; await _db.SaveChangesAsync(); using (var mailer = new EmailController()) { EmailResult mail = null; //edit by IT-user if (requestViewModel.EditByIt) { //job started right now, IT-user selected if (started) { //mail for user (job started) mail = await mailer.Accepted(requestViewModel.Id); mail?.Deliver(); //mail for selected IT user (request assigned) mail = await mailer.EditByIt(requestViewModel.Id, User.Identity.Name.GetUserName()); mail?.Deliver(); } //job in progress, IT-user changed by another IT-user else if (itUserChanged) { //mail for selected IT user (request assigned) mail = await mailer.EditByIt(requestViewModel.Id, User.Identity.Name.GetUserName()); mail?.Deliver(); } } //edit by user else { switch (supportRequest.State) { //job in progress case 1: //mail for selected IT user (request changed) mail = await mailer.EditByUser(requestViewModel.Id); break; //job is done, user added mark and feedback case 2: //mail for IT managers mail = await mailer.Feedback(requestViewModel.Id); break; } mail?.Deliver(); } } return(RedirectToAction("Index")); }
public async Task <ActionResult> Create(SupportRequestViewModel supportRequest) { if (!ModelState.IsValid) { return(View(supportRequest)); } if (string.IsNullOrEmpty(supportRequest.Text)) { // return view with error message ModelState.AddModelError(string.Empty, "Введите текст заявки!"); return(View(supportRequest)); } var fromIt = false; var login = User.Identity.Name; var accountName = login.Substring(5, login.Length - 5); var person = _db.Persons.FirstOrDefault(p => p.AccountName == accountName); if (person == null) { ModelState.AddModelError(string.Empty, "Ошибка авторизации!"); return(View(supportRequest)); } Computer comp = null; SupportFile requestFile = null; //support request has attached file if (supportRequest.Upload != null && supportRequest.Upload.ContentLength > 0) { if (supportRequest.Upload.ContentLength > 10485760) { ModelState.AddModelError(string.Empty, "Файл должен быть меньше 10 МБ!"); return(View(supportRequest)); } var fileName = Path.GetFileName(supportRequest.Upload.FileName); if (!string.IsNullOrEmpty(fileName)) { var dir = Directory.CreateDirectory(Path.Combine(HostingEnvironment.MapPath(@"~/SupportFiles"), Guid.NewGuid().ToString())); var filePath = Path.Combine(dir.FullName, fileName); supportRequest.Upload.SaveAs(filePath); requestFile = new SupportFile { Path = filePath }; _db.SupportFiles.Add(requestFile); } } var newRequest = new SupportRequest { Text = supportRequest.Text, Urgency = supportRequest.Urgency, Category = supportRequest.Category, CreationTime = DateTime.Now, FinishTime = null, File = requestFile }; //created by IT-user if (supportRequest.ToId != 0 && supportRequest.FromId != 0) { var ituser = await _db.Persons.FindAsync(supportRequest.ToId); var user = await _db.Persons.FindAsync(supportRequest.FromId); if (ituser == null || user == null) { ModelState.AddModelError(string.Empty, "Пользователь не найден!"); return(View(supportRequest)); } comp = _db.Computers.Where(c => c.Owner.Id == user.Id).OrderByDescending(c => c.LastReportDate).FirstOrDefault(); newRequest.To = ituser; newRequest.From = user; newRequest.State = 1; newRequest.StartTime = DateTime.Now; user.SupportRequests.Add(newRequest); _db.Entry(user).State = EntityState.Modified; fromIt = true; } //created by ordinary user else { var compName = StaticData.GetCompName(Request.UserHostName); if (!string.IsNullOrEmpty(compName)) { comp = _db.Computers.FirstOrDefault(c => c.ComputerName == compName); } newRequest.From = person; newRequest.State = 0; newRequest.StartTime = null; person.SupportRequests.Add(newRequest); _db.Entry(person).State = EntityState.Modified; } if (comp != null) { newRequest.FromComputer = comp; comp.SupportRequests.Add(newRequest); _db.Entry(comp).State = EntityState.Modified; } _db.SupportRequests.Add(newRequest); _db.SaveChanges(); using (var mailer = new EmailController()) { EmailResult mail; if (fromIt) { //mail for selected IT user mail = await mailer.EditByIt(newRequest.Id, User.Identity.Name.GetUserName()); mail?.Deliver(); //mail for user (job started) mail = await mailer.Accepted(newRequest.Id); mail?.Deliver(); } else { //mail for IT users mail = await mailer.NewFromUser(newRequest.Id); mail?.Deliver(); } } return(RedirectToAction("Index")); }