public IActionResult Index() { var lastPage = _sessionService.GetLastPage(); _sessionService.SetLastPage("form/check-your-answers"); try { _sessionService.ClearChangeModeRedirectId(); var formVm = _sessionService.GetFormVmFromSession(); if (formVm == null) { return(GetCustomErrorCode(EnumStatusCode.CYAFormNullError, "Error with user session. formVm is null.")); } if ((_sessionService.GetUserSession().LocationName) == null) { return(GetCustomErrorCode(EnumStatusCode.CYALocationNullError, "Error with user session. Location is null.")); } //check if the user answered the required questions to show this page var pageVm = formVm.Pages.Where(p => p.PageId == _pageId).FirstOrDefault(); if (!_pageHelper.CheckPageHistory(pageVm, lastPage, true, _sessionService, null)) { return(GetCustomErrorCode(EnumStatusCode.CYASubmissionHistoryError, "Error with user submission. Page history not found: Id='" + _pageId + "'")); } var vm = new CheckYourAnswersVm { FormVm = formVm, SendConfirmationEmail = true, LocationName = _sessionService.GetUserSession().LocationName, PageHistory = _sessionService.GetNavOrder() }; ViewBag.Title = "Check your answers" + _configuration.GetSection("ApplicationSettings:SiteTextStrings").GetValue <string>("SiteTitleSuffix"); return(View(vm)); } catch (Exception ex) { ex.Data.Add("GFCError", "Unexpected error loading FormVM."); throw ex; } }
public IActionResult Index() { try { var formVm = _sessionService.GetFormVmFromSession(); if (formVm == null) { return(GetCustomErrorCode(EnumStatusCode.CYAFormNullError, "Error with user session. formVm is null.")); } if ((_sessionService.GetUserSession().LocationName) == null) { return(GetCustomErrorCode(EnumStatusCode.CYALocationNullError, "Error with user session. Location is null.")); } var vm = new CheckYourAnswersVm { FormVm = formVm, SendConfirmationEmail = true, LocationName = _sessionService.GetUserSession().LocationName, PageHistory = _sessionService.GetNavOrder() }; //check for feedback if (!vm.PageHistory.Contains("give-your-feedback")) { return(GetCustomErrorCode(EnumStatusCode.CYAFeedbackNullError, "Error with user submission. No feedback found")); } ViewBag.Title = "Check your answers - Give feedback on care"; return(View(vm)); } catch (Exception ex) { ex.Data.Add("GFCError", "Unexpected error loading FormVM."); throw ex; } }
public void Index_Should_Return_574_Error() { //arrange FormVM formVm = new FormVM { Version = "123", Pages = new List <PageVM> { new PageVM { PageId = "CheckYourAnswers", PreviousPages = new List <PreviousPageVM> { new PreviousPageVM { PageId = "what-you-want-to-tell-us-about", QuestionId = "", Answer = "" }, new PreviousPageVM { PageId = "did-you-hear-about-this-form-from-a-charity", QuestionId = "", Answer = "" }, new PreviousPageVM { PageId = "give-your-feedback", QuestionId = "", Answer = "" } } } } }; CheckYourAnswersVm cyaVm = new CheckYourAnswersVm { FormVm = formVm, LocationName = "Test Location" }; SubmissionVM submission = new SubmissionVM { Id = "abc-123" }; var mockLogger = new Mock <ILogger <CheckYourAnswersController> >(); var mockSessionService = new Mock <ISessionService>(); var mockCosmosService = new Mock <ICosmosService>(); var mockSubmissionService = new Mock <ISubmissionService>(); var mockNotificationService = new Mock <INotificationService>(); var mockDocumentService = new Mock <IDocumentService>(); var mockPageHelper = new Mock <IPageHelper>(); var fakeConfiguration = new ConfigurationBuilder().Add(configData).Build(); mockSessionService.Setup(x => x.GetFormVmFromSession()).Returns(formVm); mockSessionService.Setup(x => x.GetNavOrder()).Returns(new List <string>()); mockCosmosService.Setup(x => x.GetDocumentId(It.IsAny <string>())).Returns(0); mockSubmissionService.Setup(x => x.CreateAsync(It.IsAny <SubmissionVM>())).ReturnsAsync(new SubmissionVM { Id = "123-abc" }); var mockSession = new Mock <ISession>(); var key = "userdata"; var value = new byte[0]; mockSession.Setup(x => x.Set(key, It.IsAny <byte[]>())).Callback <string, byte[]>((k, v) => value = v); mockSession.Setup(x => x.TryGetValue(key, out value)).Returns(true); var mockContext = new Mock <HttpContext>(); var mockResponse = new Mock <HttpResponse>(); var requestMock = new Mock <HttpRequest>(); var httpContext = new DefaultHttpContext(); mockResponse.Setup(x => x.HttpContext).Returns(httpContext); mockContext.Setup(s => s.Session).Returns(mockSession.Object); mockContext.Setup(s => s.Response).Returns(mockResponse.Object); mockContext.SetupGet(x => x.Request).Returns(requestMock.Object); var controllerContext = new ControllerContext() { HttpContext = mockContext.Object }; var sut = new CheckYourAnswersController(mockLogger.Object, mockSubmissionService.Object, mockCosmosService.Object, mockNotificationService.Object, mockDocumentService.Object, mockSessionService.Object, mockPageHelper.Object, fakeConfiguration); sut.ControllerContext = controllerContext; //act var result = sut.Index(cyaVm); //assert var statusResult = result as StatusResult; statusResult.StatusCode.Should().Be(574); }
public IActionResult Index(CheckYourAnswersVm vm) { try { var formVm = _sessionService.GetFormVmFromSession(); if (formVm == null) { return(GetCustomErrorCode(EnumStatusCode.CYASubmissionFormNullError, "Error submitting service feedback. Null or empty formVm.")); } var reference = _submissionService.GenerateUniqueUserRefAsync().Result.ToString(); //var reference = _submissionService.GenerateSnowmakerUserRefAsync().Result.ToString(); if (string.IsNullOrWhiteSpace(reference)) { return(GetCustomErrorCode(EnumStatusCode.CYASubmissionReferenceNullError, "Error submitting feedback! Null or empty submission Id")); } if (int.Parse(reference) == 0) { return(GetCustomErrorCode(EnumStatusCode.CYASubmissionReferenceNullError, "Error submitting feedback! zero submission Id")); } var submission = GenerateSubmission(formVm, reference); submission.SubmissionId = reference; submission = _submissionService.CreateAsync(submission).Result; if (vm?.SendConfirmationEmail == true && !string.IsNullOrWhiteSpace(reference)) { var fieldMappings = _configuration .GetSection("EmailNotification:ConfirmationEmail:FieldMappings") .Get <IEnumerable <EmailFieldMapping> >(); var feedbackUserName = submission? .Answers? .FirstOrDefault(x => x.QuestionId.Equals(fieldMappings.FirstOrDefault(y => y.Name == "name")?.FormField, StringComparison.OrdinalIgnoreCase))? .Answer ?? string.Empty; var emailAddress = submission? .Answers? .FirstOrDefault(x => x.QuestionId.Equals(fieldMappings.FirstOrDefault(y => y.Name == "email")?.FormField, StringComparison.OrdinalIgnoreCase))? .Answer ?? string.Empty; if (!string.IsNullOrWhiteSpace(emailAddress)) { var locationId = submission?.LocationId; var locationName = submission?.LocationName; var submissionId = submission?.Id; Task.Run(async() => { await SendEmailNotificationAsync(feedbackUserName, emailAddress, locationId, locationName, submissionId, reference) .ContinueWith(notificationTask => { if (notificationTask.IsFaulted) { _logger.LogError(notificationTask.Exception, $"Error sending confirmation email with submission id: [{reference}]."); } }) .ConfigureAwait(false); }); } } HttpContext.Session.Clear(); TempData.Clear();//clear any residual items HttpContext.Session.SetString("ReferenceNumber", reference); //Reset this flag so the cookie banner does not show on the confirmation page _sessionService.SetCookieFlagOnSession("true"); _sessionService.SetLastPage("form/check-your-answers"); return(RedirectToAction("Index", "Confirmation")); } catch (Exception ex) { ex.Data.Add("GFCError", "Unexpected error submitting feedback!"); throw ex; } }
public IActionResult Index() { var lastPage = _sessionService.GetLastPage(); if (lastPage != null && lastPage.Contains("you-have-sent-your-feedback")) { return(GetCustomErrorCode(EnumStatusCode.FormPageAlreadySubmittedError, "Error with user action. Feedback already submitted")); } _sessionService.SetLastPage("form/check-your-answers"); try { _sessionService.ClearChangeModeRedirectId(); var formVm = _sessionService.GetFormVmFromSession(); if (formVm == null) { //clicking on old link or back button from submit does this return(GetCustomErrorCode(EnumStatusCode.CYAFormNullError, "Error with user session. formVm is null.")); } if ((_sessionService.GetUserSession().LocationName) == null) { return(GetCustomErrorCode(EnumStatusCode.CYALocationNullError, "Error with user session. Location is null.")); } //check if the user answered the required questions to show this page var locationName = _sessionService.GetUserSession().LocationName; var defaultLocation = _configuration.GetSection("ApplicationSettings:SiteTextStrings").GetValue <string>("DefaultServiceName"); var serviceNotFoundPage = _configuration.GetSection("ApplicationSettings").GetValue <string>("ServiceNotFoundPage"); var formStartPage = _configuration.GetSection("ApplicationSettings").GetValue <string>("FormStartPage"); var serviceNotFound = locationName.Equals(defaultLocation); var pageVm = formVm.Pages.FirstOrDefault(p => p.PageId == _pageId); if (!serviceNotFound) { //a location has been selected but we may have a service not found visit that we need to remove //or it will be displayed _sessionService.RemoveFromNavOrder(serviceNotFoundPage); } if (!_pageHelper.CheckPageHistory(pageVm, lastPage, true, _sessionService, null, serviceNotFoundPage, formStartPage, serviceNotFound)) { //user jumps between pages return(GetCustomErrorCode(EnumStatusCode.CYASubmissionHistoryError, "Error with user submission. Page history not found: Id='" + _pageId + "'")); } var vm = new CheckYourAnswersVm { FormVm = formVm, SendConfirmationEmail = true, LocationName = _sessionService.GetUserSession().LocationName, PageHistory = _sessionService.GetNavOrder() }; //Setting up variables to ensure we can show the 'another charity' answer if the custom charity is blank. var charityQuestionPage = formVm.Pages.FirstOrDefault(p => p.PageId == _configuration .GetSection("ApplicationSettings:PageIdStrings") .GetValue <String>("TellUsWhichCharityPage")); var tellUsWhichCharityQuestion = _configuration .GetSection("ApplicationSettings:QuestionStrings:TellUsWhichCharityQuestion") .GetValue <String>("id"); var anotherCharityAnswer = _configuration .GetSection("ApplicationSettings:QuestionStrings:TellUsWhichCharityQuestion") .GetValue <String>("AnotherCharityAnswer"); var customCharityQuestion = _configuration .GetSection("ApplicationSettings:QuestionStrings:CustomCharityQuestion") .GetValue <String>("id"); var anotherCharityFlag = charityQuestionPage .Questions.FirstOrDefault(q => q.QuestionId == tellUsWhichCharityQuestion)? .Answer == anotherCharityAnswer; var customCharityBlankFlag = string.IsNullOrEmpty(charityQuestionPage .Questions.FirstOrDefault(q => q.QuestionId == customCharityQuestion)? .Answer); ViewBag.Title = "Check your answers" + _configuration.GetSection("ApplicationSettings:SiteTextStrings").GetValue <string>("SiteTitleSuffix"); ViewBag.TellUsWhichCharityQuestion = tellUsWhichCharityQuestion; ViewBag.AnotherCharityFlag = anotherCharityFlag; ViewBag.CustomCharityBlankFlag = customCharityBlankFlag; return(View(vm)); } catch (Exception ex) { ex.Data.Add("GFCError", "Unexpected error loading FormVM."); throw ex; } }
public IActionResult Index(CheckYourAnswersVm vm) { try { var formVm = _sessionService.GetFormVmFromSession(); if (formVm == null) { //session timeout does this return(GetCustomErrorCode(EnumStatusCode.CYASubmissionFormNullError, "Error submitting service feedback. Null or empty formVm.")); } // Create first instance of the record, with no gfc_id or word doc var submission = GenerateSubmission(formVm, "", ""); try { submission = PopulateSubmission(submission); } catch (ArgumentOutOfRangeException ex) when(ex.ParamName == "documentId") { return(GetCustomErrorCode(EnumStatusCode.CYASubmissionReferenceNullError, "Error submitting feedback! Null or empty DocumentId")); } // Update cosmos with our updated record and send submission to Service Bus submission = _submissionService.SendSubmission(submission.Id, submission).Result; //Clear the session HttpContext.Session.Clear(); TempData.Clear();//clear any residual items HttpContext.Session.SetString("ReferenceNumber", submission.SubmissionId); //Reset this flag so the cookie banner does not show on the confirmation page _sessionService.SetCookieFlagOnSession("true"); _sessionService.SetLastPage("form/check-your-answers"); #region setting session variables for confirmation page //Get variables for confirmation page content from appSettings var toldServiceQuestion = _configuration .GetSection("ApplicationSettings:QuestionStrings:ToldServiceQuestion") .GetValue <string>("id"); var goodBadFeedbackQuestion = _configuration .GetSection("ApplicationSettings:QuestionStrings:GoodBadFeedbackQuestion") .GetValue <string>("id"); var emailQuestion = _configuration .GetSection("ApplicationSettings:QuestionStrings:EmailQuestion") .GetValue <string>("id"); var phoneNumberQuestion = _configuration .GetSection("ApplicationSettings:QuestionStrings:PhoneNumberQuestion") .GetValue <string>("id"); var formalComplaint = _configuration .GetSection("ApplicationSettings:QuestionStrings:ToldServiceQuestion") .GetValue <string>("MadeFormalComplaintAnswer"); var toldNoComplaint = _configuration .GetSection("ApplicationSettings:QuestionStrings:ToldServiceQuestion") .GetValue <string>("ToldServiceNoComplaintAnswer"); var goodExperience = _configuration .GetSection("ApplicationSettings:QuestionStrings:GoodBadFeedbackQuestion") .GetValue <string>("GoodFeedbackAnswer"); //Set variables for confirmation page content var toldServiceAnswer = submission.Answers.FirstOrDefault(a => a.QuestionId == toldServiceQuestion)?.Answer; var goodFeedback = submission.Answers.FirstOrDefault(a => a.QuestionId == goodBadFeedbackQuestion)?.Answer == goodExperience ? "true" : "false"; HttpContext.Session.SetString("OnlyGoodFeedback", goodFeedback); HttpContext.Session.SetString("SubmittedEmail", string.IsNullOrEmpty(submission.Answers .FirstOrDefault(a => a.QuestionId == emailQuestion)?.Answer) ? "false" : "true"); HttpContext.Session.SetString("SubmittedPhoneNumber", string.IsNullOrEmpty(submission.Answers .FirstOrDefault(a => a.QuestionId == phoneNumberQuestion)?.Answer) ? "false" : "true"); HttpContext.Session.SetString("AnsweredToldServiceQuestion", !string.IsNullOrWhiteSpace(toldServiceAnswer) ? "true" : "false"); HttpContext.Session.SetString("MadeComplaint", toldServiceAnswer == formalComplaint ? "true" : "false"); #endregion #region sending confirmation emails //Send confirmation email, taking into account whether location was given and whether this is good feedback. if (vm?.SendConfirmationEmail == true && !string.IsNullOrWhiteSpace(submission.SubmissionId)) { var fieldMappings = _configuration .GetSection("EmailNotification:ConfirmationEmail:FieldMappings") .Get <IEnumerable <EmailFieldMapping> >(); var feedbackUserName = submission? .Answers? .FirstOrDefault(x => x.QuestionId.Equals(fieldMappings.FirstOrDefault(y => y.Name == "name")?.FormField, StringComparison.OrdinalIgnoreCase))? .Answer ?? string.Empty; var emailAddress = submission? .Answers? .FirstOrDefault(x => x.QuestionId.Equals(fieldMappings.FirstOrDefault(y => y.Name == "email")?.FormField, StringComparison.OrdinalIgnoreCase))? .Answer ?? string.Empty; if (!string.IsNullOrWhiteSpace(emailAddress)) { var locationId = submission?.LocationId; var locationName = submission?.LocationName; var submissionId = submission?.Id; Task.Run(async() => { await SendEmailNotificationAsync(feedbackUserName, emailAddress, locationId, locationName, submissionId, submission.SubmissionId, goodFeedback.ToBoolean()) .ContinueWith(notificationTask => { if (notificationTask.IsFaulted) { _logger.LogError(notificationTask.Exception, $"Error sending confirmation email with submission id: [{submission.SubmissionId}]."); } }) .ConfigureAwait(false); }); } } #endregion return(RedirectToAction("Index", "Confirmation")); } catch (Exception ex) { ex.Data.Add("GFCError", "Unexpected error submitting feedback!"); throw ex; } }