Exemple #1
0
        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;
            }
        }
Exemple #2
0
        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;
            }
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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;
            }
        }