Ejemplo n.º 1
0
        public async Task SaveFormModelToDbAsync(DynamicForm formModel, string formSubmissionId, string formUrlSlug, string sectionUrlSlug, bool isValid, CancellationToken cancellationToken = default(CancellationToken))
        {
            var formDisplayValues = GetFormDisplayValues(formModel);

            var formSubmissionGuid       = new Guid(formSubmissionId);
            FormSubmissionDto submission = await _dynamicFormsApplicationServices.FormSubmissionApplicationService.GetByIdAsync(formSubmissionGuid, cancellationToken);

            bool newSubmission = true;

            if (submission != null)
            {
                newSubmission = false;
            }

            FormSectionSubmissionDto sectionSubmission = null;

            if (!string.IsNullOrEmpty(formSubmissionId) && !string.IsNullOrEmpty(sectionUrlSlug))
            {
                sectionSubmission = await _dynamicFormsApplicationServices.FormSectionSubmissionApplicationService.GetOneAsync(cancellationToken, fss => fss.FormSubmissionId == formSubmissionGuid && fss.UrlSlug == sectionUrlSlug, true);
            }

            bool newSectionSubmission = false;

            if (sectionSubmission == null)
            {
                newSectionSubmission = true;
                sectionSubmission    = new FormSectionSubmissionDto()
                {
                    FormSubmissionId = formSubmissionGuid, UrlSlug = sectionUrlSlug
                };
            }

            sectionSubmission.Valid = isValid;

            var form = await GetFormByUrlSlugAsync(formUrlSlug, cancellationToken);

            var section = await GetSectionByUrlSlugsAsync(formUrlSlug, sectionUrlSlug);

            foreach (var sectionQuestion in section.Questions)
            {
                var question = sectionQuestion.Question;

                var answer = "";
                if (formDisplayValues.ContainsKey(question.FieldName))
                {
                    answer = formDisplayValues[question.FieldName];
                }

                var questionAnswer = sectionSubmission.QuestionAnswers.FirstOrDefault(qa => qa.FieldName == question.FieldName);
                if (questionAnswer == null)
                {
                    questionAnswer = new FormSectionSubmissionQuestionAnswerDto()
                    {
                        FieldName = question.FieldName, FormSectionSubmissionId = sectionSubmission.Id
                    };
                    sectionSubmission.QuestionAnswers.Add(questionAnswer);
                }

                questionAnswer.Question = question.QuestionText;
                questionAnswer.Answer   = answer;
            }

            if (newSubmission)
            {
                var newFormSubmission = new FormSubmissionDto()
                {
                    Id = formSubmissionGuid, FormId = form.Id
                };
                newFormSubmission.Sections.Add(sectionSubmission);
                await _dynamicFormsApplicationServices.FormSubmissionApplicationService.CreateAsync(newFormSubmission, "", cancellationToken);
            }
            else
            {
                if (newSectionSubmission)
                {
                    await _dynamicFormsApplicationServices.FormSectionSubmissionApplicationService.CreateAsync(sectionSubmission, "", cancellationToken);
                }
                else
                {
                    await _dynamicFormsApplicationServices.FormSectionSubmissionApplicationService.UpdateGraphAsync(sectionSubmission.Id, sectionSubmission, "", cancellationToken);
                }
            }
        }
Ejemplo n.º 2
0
        public async Task PopulateFormModelFromDbAsync(DynamicForm formModel, string formSubmissionId, string sectionUrlSlug, CancellationToken cancellationToken = default(CancellationToken))
        {
            FormSectionSubmissionDto sectionSubmission = null;

            if (!string.IsNullOrEmpty(formSubmissionId) && !string.IsNullOrEmpty(sectionUrlSlug))
            {
                var formSubmissionGuid = new Guid(formSubmissionId);
                sectionSubmission = await _dynamicFormsApplicationServices.FormSectionSubmissionApplicationService.GetOneAsync(cancellationToken, fss => fss.FormSubmissionId == formSubmissionGuid && fss.UrlSlug == sectionUrlSlug, true);
            }

            if (sectionSubmission != null)
            {
                var properties = formModel.GetProperties();

                foreach (var propertyName in formModel.GetDynamicMemberNames())
                {
                    var persistedValue = sectionSubmission.QuestionAnswers.Where(qa => qa.FieldName == propertyName).FirstOrDefault();
                    if (persistedValue != null)
                    {
                        bool isCollection = formModel.IsCollectionProperty(propertyName);
                        var  property     = properties.Find(propertyName, true);

                        if (isCollection)
                        {
                            var genericCollectionType = typeof(List <>).MakeGenericType(property.PropertyType.GetGenericArguments()[0]);
                            var newCollection         = Activator.CreateInstance(genericCollectionType);

                            formModel[propertyName] = newCollection;

                            var addMethod = genericCollectionType.GetMethod("Add");

                            foreach (var csvSplit in persistedValue.Answer.Split(','))
                            {
                                var convertedValue = Convert.ChangeType(csvSplit.Trim(), property.PropertyType.GetGenericArguments()[0]);
                                addMethod.Invoke(newCollection, new object[] { convertedValue });
                            }
                        }
                        else if (property.PropertyType == typeof(DateTime))
                        {
                            if (!String.IsNullOrWhiteSpace(persistedValue.Answer))
                            {
                                //ISO 8601
                                var parsedValue = DateTime.Parse(persistedValue.Answer, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
                                formModel[propertyName] = parsedValue;
                            }
                            else
                            {
                                formModel[propertyName] = new DateTime();
                            }
                        }
                        else if (property.PropertyType == typeof(bool))
                        {
                            formModel[propertyName] = BoolParser.GetValue(persistedValue.Answer);
                        }
                        else if (property.PropertyType == typeof(decimal))
                        {
                            var convertedValue = decimal.Parse(persistedValue.Answer, NumberStyles.Currency);
                            formModel[propertyName] = convertedValue;
                        }
                        else
                        {
                            var convertedValue = Convert.ChangeType(persistedValue.Answer, property.PropertyType);
                            formModel[propertyName] = convertedValue;
                        }
                    }
                }
            }
        }