Ejemplo n.º 1
0
        public async Task <ActionResult> ServiceList([Bind(Prefix = "FindService")] OutcomeViewModel model, [FromUri] DateTime?overrideDate, [FromUri] bool?overrideFilterServices, DosEndpoint?endpoint)
        {
            if (!ModelState.IsValidField("FindService.CurrentPostcode"))
            {
                return(View(model.CurrentView, model));
            }

            model.UserInfo.CurrentAddress.IsInPilotArea = _postCodeAllowedValidator.IsAllowedPostcode(model.CurrentPostcode) == PostcodeValidatorResponse.InPathwaysArea;

            if (!model.UserInfo.CurrentAddress.IsInPilotArea)
            {
                ModelState.AddModelError("FindService.CurrentPostcode", "Sorry, this service is not currently available in your area.  Please call NHS 111 for advice now");
                return(View(model.CurrentView, model));
            }

            model.DosCheckCapacitySummaryResult = await GetServiceAvailability(model, overrideDate, overrideFilterServices.HasValue?overrideFilterServices.Value : model.FilterServices, endpoint);

            await _auditLogger.LogDosResponse(model);

            if (model.DosCheckCapacitySummaryResult.Error == null &&
                !model.DosCheckCapacitySummaryResult.ResultListEmpty)
            {
                model.GroupedDosServices =
                    _dosBuilder.FillGroupedDosServices(model.DosCheckCapacitySummaryResult.Success.Services);

                if (model.OutcomeGroup.IsAutomaticSelectionOfItkResult())
                {
                    AutoSelectFirstItkService(model);
                    if (model.SelectedService != null)
                    {
                        return(await PersonalDetails(Mapper.Map <PersonalDetailViewModel>(model)));
                    }
                }

                return(View("~\\Views\\Outcome\\ServiceList.cshtml", model));
            }

            return(View(model.CurrentView, model));
        }
Ejemplo n.º 2
0
        public async Task <OutcomeViewModel> PopulateGroupedDosResults(OutcomeViewModel model, DateTime?overrideDate, bool?overrideFilterServices, DosEndpoint?endpoint)
        {
            var dosViewModel = _dosBuilder.BuildDosViewModel(model, overrideDate);

            _auditLogger.LogDosRequest(model, dosViewModel);
            model.DosCheckCapacitySummaryResult = await _dosBuilder.FillCheckCapacitySummaryResult(dosViewModel, overrideFilterServices.HasValue?overrideFilterServices.Value : model.FilterServices, endpoint);

            if (NeedToRequeryDos(model))
            {
                _auditLogger.LogDosResponse(model, model.DosCheckCapacitySummaryResult);
                dosViewModel.Disposition = FromOutcomeViewModelToDosViewModel.DispositionResolver.ConvertToDosCode(model.Id);
                _auditLogger.LogDosRequest(model, dosViewModel);
                model.DosCheckCapacitySummaryResult = await _dosBuilder.FillCheckCapacitySummaryResult(dosViewModel, overrideFilterServices.HasValue?overrideFilterServices.Value : model.FilterServices, endpoint);

                model.DosCheckCapacitySummaryResult.IsValidationRequery = true;
            }

            model.DosCheckCapacitySummaryResult.ServicesUnavailable = model.DosCheckCapacitySummaryResult.ResultListEmpty;

            if (!model.DosCheckCapacitySummaryResult.ResultListEmpty)
            {
                model.GroupedDosServices = _dosBuilder.FillGroupedDosServices(model.DosCheckCapacitySummaryResult.Success.Services);
                model.RecommendedService = await _recommendedServiceBuilder.BuildRecommendedService(model.DosCheckCapacitySummaryResult.Success.FirstService);
            }
            else if (model.RecommendedService != null)
            {
                //reset the recommended service
                model.RecommendedService = null;
            }

            model.SurveyLink = await _surveyLinkViewModelBuilder.SurveyLinkBuilder(model);

            //_surveyLinkViewModelBuilder.AddServiceInformation(model, model.SurveyLink);

            _auditLogger.LogDosResponse(model, model.DosCheckCapacitySummaryResult);

            return(model);
        }
Ejemplo n.º 3
0
        public async Task <ActionResult> ServiceList(OutcomeViewModel model, [FromUri] DateTime?overrideDate, [FromUri] bool?overrideFilterServices)
        {
            if (!ModelState.IsValidField("UserInfo.CurrentAddress.PostCode"))
            {
                return(View(Path.GetFileNameWithoutExtension(model.CurrentView), model));
            }

            if (!_postCodeAllowedValidator.IsAllowedPostcode(model.UserInfo.CurrentAddress.Postcode))
            {
                ModelState.AddModelError("UserInfo.CurrentAddress.Postcode", "Sorry, this service is not currently available in your area.  Please call NHS 111 for advice now");
                return(View(Path.GetFileNameWithoutExtension(model.CurrentView), model));
            }

            model.DosCheckCapacitySummaryResult = await GetServiceAvailability(model, overrideDate, overrideFilterServices.HasValue?overrideFilterServices.Value : model.FilterServices);

            await _auditLogger.LogDosResponse(model);

            if (model.DosCheckCapacitySummaryResult.Error == null && !model.DosCheckCapacitySummaryResult.ResultListEmpty)
            {
                return(View("ServiceList", model));
            }

            return(View(Path.GetFileNameWithoutExtension(model.CurrentView), model));
        }
        public async Task <OutcomeViewModel> PopulateGroupedDosResults(OutcomeViewModel model, DateTime?overrideDate, bool?overrideFilterServices, DosEndpoint?endpoint)
        {
            var dosViewModel = Mapper.Map <DosViewModel>(model);

            if (overrideDate.HasValue)
            {
                dosViewModel.DispositionTime = overrideDate.Value;
            }
            var _ = _auditLogger.LogDosRequest(model, dosViewModel);

            model.DosCheckCapacitySummaryResult = await _dosBuilder.FillCheckCapacitySummaryResult(dosViewModel, overrideFilterServices.HasValue?overrideFilterServices.Value : model.FilterServices, endpoint);

            model.DosCheckCapacitySummaryResult.ServicesUnavailable = model.DosCheckCapacitySummaryResult.ResultListEmpty;

            if (!model.DosCheckCapacitySummaryResult.ResultListEmpty)
            {
                model.GroupedDosServices = _dosBuilder.FillGroupedDosServices(model.DosCheckCapacitySummaryResult.Success.Services);
            }

            _ = _auditLogger.LogDosResponse(model);

            return(model);
        }
Ejemplo n.º 5
0
        public async Task <ActionResult> Outcome(OutcomeViewModel model, [FromUri] DateTime?overrideDate, [FromUri] bool?overrideFilterServices)
        {
            const string outcomeView  = "Outcome";
            const string servicesView = "Services";

            if (!ModelState.IsValidField("UserInfo.CurrentAddress.PostCode"))
            {
                return(View("Postcode", model));
            }

            var dosViewModel = Mapper.Map <DosViewModel>(model);

            if (overrideDate.HasValue)
            {
                dosViewModel.DispositionTime = overrideDate.Value;
            }

            if (string.IsNullOrEmpty(model.UserInfo.CurrentAddress.Postcode))
            {
                await _auditLogger.LogEventData(model, "User did not enter a postcode");

                return(View(_viewRouter.GetOutcomeViewPath(model, ControllerContext, outcomeView), model));
            }

            model.UserInfo.CurrentAddress.IsInPilotArea = _postCodeAllowedValidator.IsAllowedPostcode(model.UserInfo.CurrentAddress.Postcode);

            if (!model.UserInfo.CurrentAddress.IsInPilotArea)
            {
                await _auditLogger.LogEventData(model, "User entered a postcode outside of pilot area");

                return(View(_viewRouter.GetOutcomeViewPath(model, ControllerContext, outcomeView), model));
            }

            await _auditLogger.LogDosRequest(model, dosViewModel);

            model.DosCheckCapacitySummaryResult = await _dosBuilder.FillCheckCapacitySummaryResult(dosViewModel, overrideFilterServices.HasValue?overrideFilterServices.Value : model.FilterServices);

            model.DosCheckCapacitySummaryResult.ServicesUnavailable = model.DosCheckCapacitySummaryResult.ResultListEmpty;
            await _auditLogger.LogDosResponse(model);

            if (model.DosCheckCapacitySummaryResult.Error == null && !model.DosCheckCapacitySummaryResult.ResultListEmpty)
            {
                if (model.UserInfo.CurrentAddress.IsPostcodeFirst)
                {
                    return(View(_viewRouter.GetOutcomeViewPath(model, ControllerContext, outcomeView), model));
                }
                else
                {
                    return(View(_viewRouter.GetOutcomeViewPath(model, ControllerContext, servicesView), model));
                }
            }
            else if (model.DosCheckCapacitySummaryResult.Error != null || model.DosCheckCapacitySummaryResult.ResultListEmpty)
            {
                return(View(_viewRouter.GetOutcomeViewPath(model, ControllerContext, outcomeView), model));
            }
            else
            {
                //present screen with validation errors
                return(View(_viewRouter.GetOutcomeViewPath(model, ControllerContext, outcomeView), model));
            }
        }
Ejemplo n.º 6
0
        public async Task <ActionResult> ServiceList([Bind(Prefix = "FindService")] OutcomeViewModel model, [FromUri] DateTime?overrideDate, [FromUri] bool?overrideFilterServices, DosEndpoint?endpoint)
        {
            // Set model.OutcomePage to "Other ways to get help" page so that survey link can be created correctly
            model.OutcomePage = OutcomePage.OtherServices;

            var reason = Request.Form["reason"];

            _auditLogger.LogPrimaryCareReason(model, reason);
            if (Request.Form["OtherServices"] != null)
            {
                _auditLogger.LogPrimaryCareReason(model, "Patient clicked other things you can do");
            }

            if (!ModelState.IsValidField("FindService.CurrentPostcode"))
            {
                return(View(model.CurrentView, model));
            }

            var postcodeValidatorResponse = await PostCodeAllowedValidator.IsAllowedPostcodeAsync(model.CurrentPostcode).ConfigureAwait(false);

            if (!postcodeValidatorResponse.IsInAreaForOutcome())
            {
                ModelState.AddModelError("FindService.CurrentPostcode", "Sorry, this service is not currently available in your area.  Please call NHS 111 for advice now");
                return(View(model.CurrentView, model));
            }

            var modelFilterServices = overrideFilterServices.HasValue ? overrideFilterServices.Value : model.FilterServices;
            //need to capture this value and reapply now we have other services option for Serivce first
            var isValidationRequery = model.DosCheckCapacitySummaryResult.IsValidationRequery;

            model.DosCheckCapacitySummaryResult = await GetServiceAvailability(model, overrideDate, modelFilterServices, endpoint).ConfigureAwait(false);

            model.DosCheckCapacitySummaryResult.IsValidationRequery = isValidationRequery;
            _auditLogger.LogDosResponse(model, model.DosCheckCapacitySummaryResult);

            model.NodeType = NodeType.Outcome;

            if (model.DosCheckCapacitySummaryResult.Error == null &&
                !model.DosCheckCapacitySummaryResult.ResultListEmpty)
            {
                if (model.OutcomeGroup.Is999NonUrgent && !model.DosCheckCapacitySummaryResult.HasITKServices)
                {
                    model.CurrentView = _viewRouter.Build(model, this.ControllerContext).ViewName;
                    return(View(model.CurrentView, model));
                }

                model.GroupedDosServices =
                    _dosBuilder.FillGroupedDosServices(model.DosCheckCapacitySummaryResult.Success.Services);

                model = await _outcomeViewModelBuilder.PrimaryCareBuilder(model, reason).ConfigureAwait(false);

                if (model.OutcomeGroup.IsAutomaticSelectionOfItkResult())
                {
                    AutoSelectFirstItkService(model);
                    if (model.SelectedService != null)
                    {
                        var personalDetailsController = DependencyResolver.Current.GetService <PersonalDetailsController>();
                        personalDetailsController.ControllerContext = new ControllerContext(ControllerContext.RequestContext, personalDetailsController);

                        return(await personalDetailsController.PersonalDetails(Mapper.Map <PersonalDetailViewModel>(model)).ConfigureAwait(false));
                    }
                }

                if (model.OutcomeGroup.IsServiceFirst ||
                    model.OutcomeGroup.IsPrimaryCare ||
                    model.OutcomeGroup.IsPharmacy ||
                    model.OutcomeGroup.IsAccidentAndEmergencySexualAssault)
                {
                    var otherServices =
                        await _recommendedServiceBuilder.BuildRecommendedServicesList(model.DosCheckCapacitySummaryResult.Success.Services).ConfigureAwait(false);

                    var otherServicesModel = Mapper.Map <OtherServicesViewModel>(model);

                    //Somehow got here despite only 1 service (refresh after service close) so go back to recommendedservice page.
                    if (otherServices.Count() == 1 && model.OutcomeGroup.IsServiceFirst)
                    {
                        otherServicesModel.RecommendedService = otherServices.First();
                        return(RecommendedService(otherServicesModel));
                    }

                    //Very weird mapper issue ignoring this property for some reason
                    //unit test specifically testing this passes fine so can really fathow what is going on
                    //forcing it instead
                    if (otherServicesModel.RecommendedService != null)
                    {
                        otherServicesModel.RecommendedService.ReasonText = model.RecommendedService.ReasonText;
                        otherServicesModel.OtherServices = otherServices.Skip(1);
                    }
                    else
                    {
                        otherServicesModel.OtherServices = otherServices;
                    }

                    if (model.OutcomeGroup.IsPharmacy)
                    {
                        var serviceTypeOffered = otherServices.GetServiceTypeOffered();
                        _auditLogger.LogEvent(otherServicesModel, EventType.CallbackServiceTypeOffered, serviceTypeOffered.ToString(), "~\\Views\\Outcome\\ServiceList.cshtml");
                    }
                    return(View("~\\Views\\Outcome\\Service_First\\OtherServices.cshtml", otherServicesModel));
                }

                return(View("~\\Views\\Outcome\\ServiceList.cshtml", model));
            }

            if (model.OutcomeGroup.Is999NonUrgent)
            {
                model.CurrentView = _viewRouter.Build(model, this.ControllerContext).ViewName;
            }

            return(View(model.OutcomeGroup.IsServiceFirst ? string.Format("~\\Views\\Outcome\\Service_First\\{0}\\ServiceNotOffered.cshtml", model.ServiceGroup.Id) : model.CurrentView, model));
        }