Task IModelBinder.BindModelAsync(ModelBindingContext bindingContext) { RequestHelpViewModel model = JsonConvert.DeserializeObject <RequestHelpViewModel>(bindingContext.ValueProvider.GetValue("requestHelp").FirstValue, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects }); model.Action = bindingContext.ValueProvider.GetValue("formAction").FirstValue; var type = Type.GetType(model.ToString()); bindingContext.ModelMetadata = _provider.GetMetadataForType(type); bindingContext.Result = ModelBindingResult.Success(model); return(Task.CompletedTask); }
public async Task <IActionResult> RequestHelp( [ModelBinder(BinderType = typeof(RequestHelpModelBinder))] RequestHelpViewModel requestHelp, [ModelBinder(BinderType = typeof(RequestHelpStepsViewModelBinder))] IRequestHelpStageViewModel step, CancellationToken cancellationToken) { try { requestHelp.Errors = new List <string>(); requestHelp.Steps[requestHelp.CurrentStepIndex] = step; if (requestHelp.Action == "EditRequest") { requestHelp.CurrentStepIndex = 0; return(View(requestHelp)); } if (requestHelp.Action == "EditDetails") { requestHelp.CurrentStepIndex = 1; return(View(requestHelp)); } if (requestHelp.Action == "back") { requestHelp.CurrentStepIndex--; return(View(requestHelp)); } if (!ModelState.IsValid) { throw new ValidationException("Model Validation failed"); } if (requestHelp.Action == "next") { requestHelp.CurrentStepIndex++; if (step is RequestHelpRequestStageViewModel) { var requestStep = (RequestHelpRequestStageViewModel)step; var detailStage = (RequestHelpDetailStageViewModel)requestHelp.Steps.Where(x => x is RequestHelpDetailStageViewModel).FirstOrDefault(); var reviewStage = (RequestHelpReviewStageViewModel)requestHelp.Steps.Where(x => x is RequestHelpReviewStageViewModel).First(); if (detailStage != null) { detailStage.Type = requestStep.Requestors.Where(x => x.IsSelected).First().Type; detailStage.Questions = await UpdateQuestionsViewModel(detailStage.Questions, requestHelp.RequestHelpFormVariant, RequestHelpFormStage.Detail, (SupportActivities)requestHelp.SelectedSupportActivity(), requestHelp.ReferringGroupID); detailStage.NeedBothNames = requestStep.Tasks.Where(x => x.IsSelected).Any(x => x.SupportActivity == SupportActivities.CollectingPrescriptions); var loggedInUser = await _authService.GetCurrentUser(HttpContext, cancellationToken); if (loggedInUser != null) { switch (detailStage.Type) { case RequestorType.Myself: if (detailStage.Recipient == null) { detailStage.Recipient = new RecipientDetails { Firstname = loggedInUser.UserPersonalDetails.FirstName, Lastname = loggedInUser.UserPersonalDetails.LastName, AddressLine1 = loggedInUser.UserPersonalDetails.Address.AddressLine1, AddressLine2 = loggedInUser.UserPersonalDetails.Address.AddressLine2, AlternatePhoneNumber = loggedInUser.UserPersonalDetails.OtherPhone, MobileNumber = loggedInUser.UserPersonalDetails.MobilePhone, Email = loggedInUser.UserPersonalDetails.EmailAddress, Postcode = loggedInUser.UserPersonalDetails.Address.Postcode, Town = loggedInUser.UserPersonalDetails.Address.Locality }; } break; case RequestorType.Organisation: case RequestorType.OnBehalf: if (detailStage.Requestor == null) { detailStage.Requestor = new RequestorDetails { Firstname = loggedInUser.UserPersonalDetails.FirstName, Lastname = loggedInUser.UserPersonalDetails.LastName, AlternatePhoneNumber = loggedInUser.UserPersonalDetails.OtherPhone, MobileNumber = loggedInUser.UserPersonalDetails.MobilePhone, Email = loggedInUser.UserPersonalDetails.EmailAddress, Postcode = loggedInUser.UserPersonalDetails.Address.Postcode, }; } break; } } } reviewStage.Task = requestStep.Tasks.Where(x => x.IsSelected).FirstOrDefault(); reviewStage.TimeRequested = requestStep.Timeframes.Where(X => X.IsSelected).FirstOrDefault(); reviewStage.RequestedFor = requestStep.Requestors.Where(x => x.IsSelected).FirstOrDefault(); reviewStage.RequestStageQuestions = requestStep.Questions.Questions; } if (step is RequestHelpDetailStageViewModel) { var requestStage = (RequestHelpRequestStageViewModel)requestHelp.Steps.Where(x => x is RequestHelpRequestStageViewModel).First(); var detailStage = (RequestHelpDetailStageViewModel)step; var reviewStage = (RequestHelpReviewStageViewModel)requestHelp.Steps.Where(x => x is RequestHelpReviewStageViewModel).First(); reviewStage.Recipient = detailStage.Recipient; reviewStage.Requestor = detailStage.Requestor; reviewStage.OrganisationName = detailStage.Organisation; reviewStage.DetailsStageQuestions = detailStage.Questions.Questions; reviewStage.ShowRequestor = detailStage.ShowRequestorFields && (reviewStage.RequestedFor.Type != RequestorType.Myself); } } if (requestHelp.Action == "finish") { var requestStage = (RequestHelpRequestStageViewModel)requestHelp.Steps.Where(x => x is RequestHelpRequestStageViewModel).First(); var detailStage = (RequestHelpDetailStageViewModel)requestHelp.Steps.Where(x => x is RequestHelpDetailStageViewModel).FirstOrDefault(); var user = await _authService.GetCurrentUser(HttpContext, cancellationToken); var response = await _requestService.LogRequestAsync(requestStage, detailStage, requestHelp.ReferringGroupID, requestHelp.Source, user?.ID ?? 0, cancellationToken); if (response != null && response.Fulfillable.Equals(Fulfillable.Accepted_ManualReferral)) { return(RedirectToRoute("request-help/success", new { fulfillable = response.Fulfillable, requestHelpFormVariant = requestHelp.RequestHelpFormVariant, referringGroup = Base64Utils.Base64Encode(requestHelp.ReferringGroupID), source = requestHelp.Source })); } else { throw new Exception($"Bad response from PostNewRequestForHelpRequest: {response?.Fulfillable}"); } } } catch (ValidationException vex) { _logger.LogError(vex, "a validation error occured in request help form action"); } catch (Exception ex) { _logger.LogError(ex, "an error occured in request help form action"); requestHelp.Errors.Add("Oops! An error occured submitting your request; please try again later."); } return(View(requestHelp)); }
public async Task <RequestHelpViewModel> GetSteps(RequestHelpJourney requestHelpJourney, int referringGroupID, string source) { RequestHelpFormVariant requestHelpFormVariant = requestHelpJourney.RequestHelpFormVariant; var model = new RequestHelpViewModel { ReferringGroupID = referringGroupID, Source = source, RequestHelpFormVariant = requestHelpFormVariant, CurrentStepIndex = 0, Steps = new List <IRequestHelpStageViewModel> { new RequestHelpRequestStageViewModel { PageHeading = GetHelpRequestPageTitle(requestHelpFormVariant), IntoText = GetHelpRequestPageIntroText(requestHelpFormVariant), Tasks = await GetRequestHelpTasks(requestHelpFormVariant), Requestors = new List <RequestorViewModel> { new RequestorViewModel { ID = 1, ColourCode = "orange", Title = "I am requesting help for myself", Text = "I'm the person in need of help", IconDark = "request-myself.svg", IconLight = "request-myself-white.svg", Type = RequestorType.Myself }, new RequestorViewModel { ID = 2, ColourCode = "dark-blue", Title = "On behalf of someone else", Text = "I'm looking for help for a relative, neighbour or friend", IconDark = "request-behalf.svg", IconLight = "request-behalf-white.svg", Type = RequestorType.OnBehalf }, new RequestorViewModel { ID = 3, ColourCode = "dark-blue", Title = "On behalf of an organisation", Text = "I'm looking for help for an organisation", IconDark = "request-organisation.svg", IconLight = "request-organisation-white.svg", Type = RequestorType.Organisation } }, Timeframes = new List <RequestHelpTimeViewModel> { new RequestHelpTimeViewModel { ID = 1, DueDateType = DueDateType.Before, TimeDescription = "Today", Days = 0 }, new RequestHelpTimeViewModel { ID = 2, DueDateType = DueDateType.Before, TimeDescription = "Within 24 Hours", Days = 1 }, new RequestHelpTimeViewModel { ID = 3, DueDateType = DueDateType.Before, TimeDescription = "Within a Week", Days = 7 }, new RequestHelpTimeViewModel { ID = 4, DueDateType = DueDateType.Before, TimeDescription = "When Convenient", Days = 30 }, new RequestHelpTimeViewModel { ID = 5, DueDateType = DueDateType.Before, TimeDescription = "Other", AllowCustom = true }, }, }, new RequestHelpDetailStageViewModel() { ShowRequestorFields = !requestHelpJourney.RequestorDefinedByGroup, FullRecipientAddressRequired = true, }, new RequestHelpReviewStageViewModel(), } }; if (requestHelpFormVariant == RequestHelpFormVariant.FtLOS) { ((RequestHelpRequestStageViewModel)model.Steps.First()).Timeframes.RemoveRange(0, 2); } if (requestHelpFormVariant == RequestHelpFormVariant.AgeUKWirral || requestHelpFormVariant == RequestHelpFormVariant.VitalsForVeterans) { var requestStep = ((RequestHelpRequestStageViewModel)model.Steps.Where(x => x is RequestHelpRequestStageViewModel).First()); requestStep.Requestors.RemoveAll(x => x.Type == RequestorType.Myself); requestStep.Timeframes.Insert(0, new RequestHelpTimeViewModel() { ID = 6, TimeDescription = "On a Specific Date", DueDateType = DueDateType.On }); } if (requestHelpFormVariant == RequestHelpFormVariant.AgeUKSouthKentCoast_Public) { ((RequestHelpRequestStageViewModel)model.Steps.First()).Timeframes.RemoveRange(0, 2); } if (requestHelpFormVariant == RequestHelpFormVariant.AgeUKSouthKentCoast_RequestSubmitter) { var requestStep = ((RequestHelpRequestStageViewModel)model.Steps.Where(x => x is RequestHelpRequestStageViewModel).First()); requestStep.Timeframes.Insert(0, new RequestHelpTimeViewModel() { ID = 6, TimeDescription = "On a Specific Date", DueDateType = DueDateType.On }); } if (requestHelpFormVariant == RequestHelpFormVariant.AgeUKFavershamAndSittingbourne_Public) { ((RequestHelpRequestStageViewModel)model.Steps.First()).Timeframes.RemoveRange(0, 2); } if (requestHelpFormVariant == RequestHelpFormVariant.AgeUKFavershamAndSittingbourne_RequestSubmitter) { var requestStep = ((RequestHelpRequestStageViewModel)model.Steps.Where(x => x is RequestHelpRequestStageViewModel).First()); requestStep.Timeframes.Insert(0, new RequestHelpTimeViewModel() { ID = 6, TimeDescription = "On a Specific Date", DueDateType = DueDateType.On }); } if (requestHelpFormVariant == RequestHelpFormVariant.AgeUKNorthWestKent_Public) { ((RequestHelpRequestStageViewModel)model.Steps.First()).Timeframes.RemoveRange(0, 2); } if (requestHelpFormVariant == RequestHelpFormVariant.MeadowsCommunityHelpers_RequestSubmitter) { var requestStep = ((RequestHelpRequestStageViewModel)model.Steps.Where(x => x is RequestHelpRequestStageViewModel).First()); requestStep.Requestors.RemoveAll(x => x.Type == RequestorType.Myself); } if (requestHelpFormVariant == RequestHelpFormVariant.MeadowsCommunityHelpers_Public) { ((RequestHelpRequestStageViewModel)model.Steps.First()).Timeframes.RemoveRange(0, 2); } if (requestHelpFormVariant == RequestHelpFormVariant.AgeUKNorthWestKent_RequestSubmitter) { var requestStep = ((RequestHelpRequestStageViewModel)model.Steps.Where(x => x is RequestHelpRequestStageViewModel).First()); requestStep.Timeframes.Insert(0, new RequestHelpTimeViewModel() { ID = 6, TimeDescription = "On a Specific Date", DueDateType = DueDateType.On }); } if (requestHelpFormVariant == RequestHelpFormVariant.AgeConnectsCardiff_Public) { var requestStep = ((RequestHelpRequestStageViewModel)model.Steps.Where(x => x is RequestHelpRequestStageViewModel).First()); requestStep.Timeframes.RemoveRange(0, 2); } if (requestHelpFormVariant == RequestHelpFormVariant.AgeConnectsCardiff_RequestSubmitter) { var requestStep = ((RequestHelpRequestStageViewModel)model.Steps.Where(x => x is RequestHelpRequestStageViewModel).First()); requestStep.Requestors.RemoveAll(x => x.Type == RequestorType.Myself); requestStep.Timeframes.Insert(0, new RequestHelpTimeViewModel() { ID = 6, TimeDescription = "On a Specific Date", DueDateType = DueDateType.On }); } if (requestHelpFormVariant == RequestHelpFormVariant.LincolnshireVolunteers || requestHelpFormVariant == RequestHelpFormVariant.Mansfield_CVS || requestHelpFormVariant == RequestHelpFormVariant.ApexBankStaff_RequestSubmitter) { var requestStep = ((RequestHelpRequestStageViewModel)model.Steps.Where(x => x is RequestHelpRequestStageViewModel).First()); requestStep.Requestors.RemoveAll(x => x.Type == RequestorType.Myself); requestStep.Requestors.RemoveAll(x => x.Type == RequestorType.OnBehalf); requestStep.Timeframes.Clear(); requestStep.Timeframes.Insert(0, new RequestHelpTimeViewModel() { ID = 7, TimeDescription = "On a Specific Date", DueDateType = DueDateType.SpecificStartAndEndTimes, IsSelected = true }); model.Steps.Remove(model.Steps.Where(x => x is RequestHelpDetailStageViewModel).First()); } if (requestHelpFormVariant == RequestHelpFormVariant.Sandbox_RequestSubmitter) { var requestStep = ((RequestHelpRequestStageViewModel)model.Steps.Where(x => x is RequestHelpRequestStageViewModel).First()); requestStep.Timeframes.Add(new RequestHelpTimeViewModel() { ID = 7, TimeDescription = "On a Specific Date", DueDateType = DueDateType.SpecificStartAndEndTimes }); } return(model); }