private Customer GetCustomerBookingDetails(FormAnswers formAnswers, FormSchema formSchema, IElement bookingElement)
        {
            var data = new ExpandoObject() as IDictionary <string, dynamic>;

            formSchema.Pages.SelectMany(_ => _.ValidatableElements)
            .Where(x => !string.IsNullOrEmpty(x.Properties.TargetMapping) &&
                   x.Properties.TargetMapping.ToLower().StartsWith("customer.") &&
                   !x.Properties.TargetMapping.ToLower().Equals("customer.address"))
            .ToList()
            .ForEach(_ => data = RecursiveCheckAndCreate(string.IsNullOrEmpty(_.Properties.TargetMapping) ? _.Properties.QuestionId : _.Properties.TargetMapping, _, formAnswers, data));

            if (!data.ContainsKey("customer"))
            {
                throw new ApplicationException($"MappingService::GetCustomerDetails, Booking request form data for form {formSchema.BaseURL} does not contain required customer object");
            }

            var customer = JsonConvert.DeserializeObject <Customer>(JsonConvert.SerializeObject(data["customer"]));

            if (string.IsNullOrEmpty(bookingElement.Properties.CustomerAddressId))
            {
                return(customer);
            }

            var addressElement = formSchema.Pages.SelectMany(_ => _.Elements)
                                 .FirstOrDefault(_ =>
                                                 _.Properties.QuestionId != null &&
                                                 _.Properties.QuestionId.Contains(bookingElement.Properties.CustomerAddressId));

            customer.Address = _elementMapper.GetAnswerStringValue(addressElement, formAnswers);

            return(customer);
        }
        public List <PageSummary> GenerateQuestionAndAnswersList(string guid, FormSchema formSchema)
        {
            var formAnswers    = GetFormData(guid);
            var reducedAnswers = FormAnswersExtensions.GetReducedAnswers(formAnswers, formSchema);
            var formSummary    = new List <PageSummary>();

            foreach (var page in formSchema.Pages.ToList())
            {
                var pageSummary = new PageSummary
                {
                    PageTitle = page.Title,
                    PageSlug  = page.PageSlug
                };

                var summaryBuilder      = new SummaryDictionaryBuilder();
                var formSchemaQuestions = page.ValidatableElements
                                          .Where(_ => _ != null)
                                          .ToList();

                if (!formSchemaQuestions.Any() || !reducedAnswers.Where(p => p.PageSlug == page.PageSlug).Select(p => p).Any())
                {
                    continue;
                }

                formSchemaQuestions.ForEach(question =>
                {
                    var answer = _elementMapper.GetAnswerStringValue(question, formAnswers);
                    summaryBuilder.Add(question.GetLabelText(), answer, question.Type);
                });

                pageSummary.Answers = summaryBuilder.Build();
                formSummary.Add(pageSummary);
            }

            return(formSummary);
        }