示例#1
0
        public static QuestionnaireTemplate FillNewQuestionnaireWithAnswers(IQuestionnaireService service, int[] answers,
                                                                            DateTime now, int userId)
        {
            GenericError          error;
            QuestionnaireTemplate localizedTemplate = service.GetQuestionnaireTemplate(1, locale, out error,
                                                                                       DateTime.Now, userId);

            Assert.IsTrue(localizedTemplate.QuestionCategories.Count == 7);

            for (int i = 0; i < localizedTemplate.QuestionCategories.Count; i++)
            {
                QuestionCategory q = localizedTemplate.QuestionCategories[i];
                q.CategoryQuestion.QuestionAnwer = new QuestionAnwer {
                    Answer = answers[i]
                };
            }

            localizedTemplate.QuestionCategories.ForEach(
                cq => cq.Questions.ForEach(q => q.QuestionAnwer = new QuestionAnwer {
                Answer = 1
            }));
            localizedTemplate.QuestionCategories[5].Questions[3].QuestionAnwer.Answer = -1;
            service.SubmitAnsweredTemplate(userId, localizedTemplate, now);
            return(localizedTemplate);
        }
示例#2
0
        public void GetQuestionnaireTemplateSummaryAsync(QuestionnaireTemplate questionnaireTemplate, Action <IOperationResult <QuestionnaireTemplateSummary> > callback)
        {
            this.service.BeginGetQuestionnaireTemplateSummary(
                questionnaireTemplate,
                (ar) =>
            {
                var operationResult = new OperationResult <QuestionnaireTemplateSummary>();

                try
                {
                    operationResult.Result = this.service.EndGetQuestionnaireTemplateSummary(ar);
                }
                catch (Exception ex)
                {
                    operationResult.Error = ex;
                }

                synchronizationContext.Post(
                    (state) =>
                {
                    callback(operationResult);
                },
                    null);
            },
                null);
        }
示例#3
0
        public void WhenQuestionHasFormattingErrorAfterHavingValidResponse_ThenViewModelCannotBeSubmitted()
        {
            var questionnaireTemplate =
                new QuestionnaireTemplate {
                Questions = { new NumericQuestionTemplate {
                                  QuestionText = "unknown"
                              } }
            };
            var viewModel =
                new QuestionnaireViewModel(
                    CreateStateMock(questionnaireTemplate).Object,
                    new Mock <IQuestionnaireRepository>().Object,
                    new Mock <ISingleViewUIService>().Object);
            var questionViewModel = ((NumericQuestionViewModel)viewModel.Questions[0]);

            viewModel.Questionnaire.Name        = "name";
            viewModel.Questionnaire.Age         = 25;
            questionViewModel.Question.Response = 100;

            Assert.IsTrue(viewModel.CanSubmit);

            questionViewModel.HasBindingError = true;

            Assert.IsFalse(viewModel.CanSubmit);
        }
示例#4
0
        public void AssignIdsForQuestionnaire(QuestionnaireTemplate qTemplate)
        {
            foreach (var qSet in qTemplate.QuestionnaireSets)
            {
                qSet.Id = newId();

                foreach (var q in qSet.Questions)
                {
                    setIdsForQuestions(q);
                }
            }

            void setIdsForQuestions(Question q)
            {
                q.Id = newId();

                if (q.AnswerOptions != null)
                {
                    foreach (var a in q.AnswerOptions)
                    {
                        setIdsAnsweers(a);
                    }
                }
            }

            void setIdsAnsweers(AnswerOption a)
            {
                if (a.ChildQuestion != null)
                {
                    setIdsForQuestions(a.ChildQuestion);
                }
            }

            string newId() => Guid.NewGuid().ToString("D").ToUpper();
        }
示例#5
0
        public void WhenCancellingModifiedQuestionnaire_ThenViewModelPromptsForConfirmation()
        {
            var questionnaireRepositoryMock = new Mock <IQuestionnaireRepository>(MockBehavior.Strict);

            var uiServiceMock = new Mock <ISingleViewUIService>(MockBehavior.Strict);

            var questionnaireTemplate =
                new QuestionnaireTemplate {
                Questions = { new NumericQuestionTemplate {
                                  QuestionText = "unknown"
                              } }
            };
            var viewModel =
                new QuestionnaireViewModel(
                    CreateStateMock(questionnaireTemplate).Object,
                    questionnaireRepositoryMock.Object,
                    uiServiceMock.Object);

            viewModel.Questionnaire.Name = "name";

            InteractionRequestedEventArgs args = null;

            viewModel.CancelConfirmationInteractionRequest.Raised += (o, e) => { args = e; };

            viewModel.Cancel();

            Assert.IsNotNull(args);
            questionnaireRepositoryMock.Verify();
            uiServiceMock.Verify();
        }
示例#6
0
        public void WhenCancellingNewQuestionnaire_ThenViewModelNavigatesToQuestionnaireListView()
        {
            var questionnaireRepositoryMock = new Mock <IQuestionnaireRepository>(MockBehavior.Strict);

            var uiServiceMock = new Mock <ISingleViewUIService>(MockBehavior.Strict);

            uiServiceMock
            .Setup(svc => svc.ShowView(ViewNames.QuestionnaireTemplatesList))
            .Verifiable();

            var questionnaireTemplate =
                new QuestionnaireTemplate {
                Questions = { new NumericQuestionTemplate {
                                  QuestionText = "unknown"
                              } }
            };
            var viewModel =
                new QuestionnaireViewModel(
                    CreateStateMock(questionnaireTemplate).Object,
                    questionnaireRepositoryMock.Object,
                    uiServiceMock.Object);

            viewModel.Cancel();

            questionnaireRepositoryMock.Verify();
            uiServiceMock.Verify();
        }
示例#7
0
        public void WhenCancellingTheConfirmationViewAfterCancellingASubmit_ThenViewModelStaysOnTheQuestionnairePage()
        {
            var questionnaireRepositoryMock = new Mock <IQuestionnaireRepository>(MockBehavior.Strict);

            var uiServiceMock = new Mock <ISingleViewUIService>(MockBehavior.Strict);

            var questionnaireTemplate =
                new QuestionnaireTemplate {
                Questions = { new NumericQuestionTemplate {
                                  QuestionText = "unknown"
                              } }
            };
            var viewModel =
                new QuestionnaireViewModel(
                    CreateStateMock(questionnaireTemplate).Object,
                    questionnaireRepositoryMock.Object,
                    uiServiceMock.Object);

            viewModel.Questionnaire.Name = "name";

            InteractionRequestedEventArgs args = null;

            viewModel.CancelConfirmationInteractionRequest.Raised += (o, e) => { args = e; };

            viewModel.Cancel();

            args.Callback();

            questionnaireRepositoryMock.Verify();
            uiServiceMock.Verify();
        }
示例#8
0
        public async Task SetUserIndexes(QuestionnaireTemplate questionnaireTemplate, string userprofileId)
        {
            var uq = await GetUserQuestionnaire_ByUserIdAsync(userprofileId, questionnaireTemplate.TypeOfQuestionnaire, questionnaireTemplate.Id);

            if (!uq.IsQuestionnaireTemplateComplete)
            {
                throw new BusinessLogicException(ValidationErrorCode.ValidationFailure_UserQuestionnaire, uq.Id, $"UserQuestionnaire with Id '{uq.Id}' is not Complete so no indexes can be set for UserId '{userprofileId}'");
            }
            if (questionnaireTemplate.QuestionnaireSets?.Count != 1)
            {
                throw new BusinessLogicException(ValidationErrorCode.ValidationFailure, questionnaireTemplate.Id, $"QuestionnaireTemplate with Id '{questionnaireTemplate.Id}' is not supported since it contains more than 1 Set of Questions, so no indexes can be set for UserId '{userprofileId}'");
            }

            var bl_usrProReg = new BL_UserProfile
            {
                Id      = userprofileId,
                Indexes = new List <BL_UserProfile.Index>()
            };

            var totalWeightForOverallIndex = 0.0M;

            foreach (var q in questionnaireTemplate.QuestionnaireSets.First().Questions)
            {
                foreach (var i in q.IndexesImpacted)
                {
                    var indexToUpdate = bl_usrProReg.Indexes.SingleOrDefault(e => e.TypeOfIndex == i.TypeOfIndex);
                    if (indexToUpdate == null)
                    {
                        indexToUpdate = new BL_UserProfile.Index {
                            TypeOfIndex = i.TypeOfIndex, Value = 0
                        };
                        bl_usrProReg.Indexes.Add(indexToUpdate);
                    }

                    int.TryParse(uq.Answers.SingleOrDefault(e => e.QuestionId == q.Id).Value, out var answerValue);

                    indexToUpdate.Value += (int)(i.CalculationWeight * decimal.Parse(answerValue.ToString()));

                    if (indexToUpdate.TypeOfIndex == IndexTypeEnum.Overall)
                    {
                        totalWeightForOverallIndex += i.CalculationWeight;
                    }
                }
            }

            foreach (var i in bl_usrProReg.Indexes)
            {
                if (i.TypeOfIndex == IndexTypeEnum.Overall)
                {
                    var newValue = i.Value / totalWeightForOverallIndex * 10;
                    i.Value = int.Parse(Math.Round(newValue, MidpointRounding.AwayFromZero).ToString());
                }
            }

            await SetUserAsync(bl_usrProReg);

            //TODO: AAAA: persist Indexes in userIndexHistory
            //await SaveIndexHistory....
        }
示例#9
0
        public IAsyncResult BeginGetQuestionnaireTemplateSummary(QuestionnaireTemplate questionnaireTemplate, AsyncCallback callback, object asyncState)
        {
            var result = new AsyncResult <QuestionnaireTemplateSummary>(callback, asyncState);

            HandleBeginGetQuestionnaireTemplateSummary(result);

            return(result);
        }
示例#10
0
        public async Task <string> CreateQuestionnaireTemplateAsync(QuestionnaireTemplate questionnaireTemplate)
        {
            questionnaireTemplate.DTCreated     = DateTimeOffset.UtcNow;
            questionnaireTemplate.DTLastUpdated = questionnaireTemplate.DTCreated;
            questionnaireTemplate.Id            = null; //Set by CosmosDb

            var up = await client.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(_settings.DatabaseId, _settings.DefaultCollectionId), SetEntityType(questionnaireTemplate));

            var newItem = (QuestionnaireTemplate)(dynamic)up.Resource;

            return(newItem.Id);
        }
示例#11
0
        public IAsyncResult BeginGetQuestionnaireTemplateSummary(QuestionnaireTemplate questionnaireTemplate, AsyncCallback callback, object userState)
        {
            var asyncResult = new AsyncResult <QuestionnaireTemplateSummary>(callback, userState);

            ThreadPool.QueueUserWorkItem(
                o =>
            {
                Thread.Sleep(1500);
                asyncResult.SetComplete(CreateQuestionnaireTemplateSummary(questionnaireTemplate), false);
            });

            return(asyncResult);
        }
示例#12
0
        public void WhenAgeIsSet_ThenHasChanges()
        {
            var questionnaireTemplate = new QuestionnaireTemplate {
                Title = "questionnaire"
            };
            var viewModel =
                new QuestionnaireViewModel(
                    CreateStateMock(questionnaireTemplate).Object,
                    new Mock <IQuestionnaireRepository>().Object,
                    new Mock <ISingleViewUIService>().Object);

            viewModel.Questionnaire.Age = 25;

            Assert.IsTrue(viewModel.HasChanges);
        }
示例#13
0
        public async Task <string> CreateQuestionnaireTemplateAsync(QuestionnaireTemplate newQuestionnaire)
        {
            string newId;

            if (validator.IsValid(newQuestionnaire))
            {
                AssignIdsForQuestionnaire(newQuestionnaire);
                newId = await _repo.CreateQuestionnaireTemplateAsync(newQuestionnaire);

                return(newId);
            }
            else
            {
                throw new NotSupportedException();
            }
        }
示例#14
0
        public void WhenQuestionnaireHasNumericQuestion_ThenTheMatchingViewModelIsCreated()
        {
            var questionnaireTemplate =
                new QuestionnaireTemplate
            {
                Questions = { new NumericQuestionTemplate {
                                  QuestionText = "Numeric"
                              } }
            };
            var viewModel =
                new QuestionnaireViewModel(
                    CreateStateMock(questionnaireTemplate).Object,
                    new Mock <IQuestionnaireRepository>().Object,
                    new Mock <ISingleViewUIService>().Object);

            Assert.IsInstanceOfType(viewModel.Questions[0], typeof(NumericQuestionViewModel));
        }
示例#15
0
        public void WhenAgeIsSetOnTheModel_ThenTheHasErrorPropertyInTheViewModelIsClearedAndSinglePropertyChangeNotificationIsFired()
        {
            var questionnaireTemplate = new QuestionnaireTemplate {
                Title = "questionnaire"
            };
            var viewModel =
                new QuestionnaireViewModel(
                    CreateStateMock(questionnaireTemplate).Object,
                    new Mock <IQuestionnaireRepository>().Object,
                    new Mock <ISingleViewUIService>().Object);

            viewModel.Questionnaire.Age  = 25;
            viewModel.Questionnaire.Name = "name";

            Assert.IsTrue(viewModel.CanSubmit);

            viewModel.HasAgeBindingError = true;

            Assert.IsFalse(viewModel.CanSubmit);
        }
示例#16
0
        public void WhenAcceptingTheConfirmationViewAfterCancellingASubmit_ThenViewModelNavigatesToQuestionnaireListView()
        {
            var questionnaireRepositoryMock = new Mock <IQuestionnaireRepository>(MockBehavior.Strict);

            bool navigatedAway = false;
            var  uiServiceMock = new Mock <ISingleViewUIService>(MockBehavior.Strict);

            uiServiceMock
            .Setup(svc => svc.ShowView(ViewNames.QuestionnaireTemplatesList))
            .Callback(() => { navigatedAway = true; })
            .Verifiable();

            var questionnaireTemplate =
                new QuestionnaireTemplate {
                Questions = { new NumericQuestionTemplate {
                                  QuestionText = "unknown"
                              } }
            };
            var viewModel =
                new QuestionnaireViewModel(
                    CreateStateMock(questionnaireTemplate).Object,
                    questionnaireRepositoryMock.Object,
                    uiServiceMock.Object);

            viewModel.Questionnaire.Name = "name";

            InteractionRequestedEventArgs args = null;

            viewModel.CancelConfirmationInteractionRequest.Raised += (o, e) => { args = e; };

            viewModel.Cancel();

            ((Confirmation)args.Context).Confirmed = true;

            args.Callback();

            Assert.IsTrue(navigatedAway);
            questionnaireRepositoryMock.Verify();
            uiServiceMock.Verify();
        }
示例#17
0
        private static QuestionnaireTemplate CreateQuestionnaireTemplate()
        {
            var questionnaireTemplate = new QuestionnaireTemplate()
            {
                Title     = "Questionnaire",
                Questions =
                {
                    new OpenQuestionTemplate()
                    {
                        QuestionText = "Enter your name",
                        MaxLength    = 25
                    },
                    new OpenQuestionTemplate()
                    {
                        QuestionText = "Enter your address",
                        MaxLength    = 25
                    }
                }
            };

            return(questionnaireTemplate);
        }
示例#18
0
        public void WhenAgeIsSet_ThenPropertyChangeOnCanSubmitIsFired()
        {
            var questionnaireTemplate = new QuestionnaireTemplate {
                Title = "questionnaire"
            };
            var viewModel =
                new QuestionnaireViewModel(
                    CreateStateMock(questionnaireTemplate).Object,
                    new Mock <IQuestionnaireRepository>().Object,
                    new Mock <ISingleViewUIService>().Object);

            int canSubmitPropertyChanges = 0;

            viewModel.PropertyChanged += (s, e) => { if (e.PropertyName == "CanSubmit")
                                                     {
                                                         canSubmitPropertyChanges++;
                                                     }
            };

            viewModel.Questionnaire.Age = 25;

            Assert.AreEqual(1, canSubmitPropertyChanges);
        }
示例#19
0
        public void WhenHasErrorIsChangedToTrueOnTheViewModel_ThenPropertyChangeOnCanSubmitIsFired()
        {
            var questionnaireTemplate = new QuestionnaireTemplate {
                Title = "questionnaire"
            };
            var viewModel =
                new QuestionnaireViewModel(
                    CreateStateMock(questionnaireTemplate).Object,
                    new Mock <IQuestionnaireRepository>().Object,
                    new Mock <ISingleViewUIService>().Object);

            int canSubmitPropertyChanges = 0;

            viewModel.PropertyChanged += (s, e) => { if (e.PropertyName == "CanSubmit")
                                                     {
                                                         canSubmitPropertyChanges++;
                                                     }
            };
            viewModel.HasAgeBindingError = true;

            // Assertions
            Assert.AreEqual(1, canSubmitPropertyChanges);
        }
示例#20
0
        public void WhenQuestionnaireHasUnknownQuestion_ThenAnExceptionIsThrown()
        {
            var questionnaireTemplate =
                new QuestionnaireTemplate
            {
                Questions = { new MockQuestionTemplate {
                                  QuestionText = "unknown"
                              } }
            };

            try
            {
                var viewModel =
                    new QuestionnaireViewModel(
                        CreateStateMock(questionnaireTemplate).Object,
                        new Mock <IQuestionnaireRepository>().Object,
                        new Mock <ISingleViewUIService>().Object);
                Assert.Fail("should have thrown");
            }
            catch (ArgumentException)
            {
                // expected
            }
        }
示例#21
0
        public void WhenExecutingTheTakeSurveyCommand_ThenRequestsTransitionToQuestionnaireView()
        {
            var repository = new Mock <IQuestionnaireRepository>();

            repository
            .Setup(r => r.GetQuestionnaireTemplatesAsync(It.IsAny <Action <IOperationResult <IEnumerable <QuestionnaireTemplate> > > >()));


            QuestionnaireTemplate templateRequested = null;
            var uiServiceMock = new Mock <ISingleViewUIService>();

            uiServiceMock
            .Setup(svc => svc.ShowView(ViewNames.CompleteQuestionnaire, It.IsAny <QuestionnaireTemplate>()))
            .Callback <string, QuestionnaireTemplate>((vn, qt) => templateRequested = qt);

            var template = new QuestionnaireTemplate();

            var templateViewModel =
                new AvailableQuestionnaireTemplatesListViewModel(repository.Object, uiServiceMock.Object);

            templateViewModel.TakeSurveyCommand.Execute(template);

            Assert.AreSame(template, templateRequested);
        }
        public override QuestionnaireTemplate BuildQuestionnaireTemplate()
        {
            const int nuberOfCategories            = 7;
            var       numBerOfQuestionsArray       = new[] { 1, 2, 2, 2, 7, 6, 6 };
            var       numBerOfPossibleAnswersArray = new[]
            {
                new[] { 4 },
                new[] { 4, 4 },
                new[] { 4, 4 },
                new[] { 4, 4 },
                new[] { 4, 4, 4, 4, 4, 4, 4 },
                new[] { 4, 4, 4, 4, 4, 4, },
                new[] { 4, 4, 4, 4, 4, 4 }
            };

            var template   = new QuestionnaireTemplate {
            };
            var categories = new List <QuestionCategory>();
            int id         = 0;

            template.QuestionCategories = categories;
            for (int i = 0; i < nuberOfCategories; i++)
            {
                id++;

                var cat = new QuestionCategory
                {
                    CategoryQuestion = new Question
                    {
                        QuestionId       = id,
                        Description      = ("T1C" + (i + 1) + "D"),
                        Help             = ("T1C" + (i + 1) + "H"),
                        PossivbleAnswers = new List <PossivbleAnswer>()
                    }
                };

                for (int qca = 0; qca < 4; qca++)
                {
                    var poassibleAnswer = new PossivbleAnswer
                    {
                        Description = ("T1C" + (i + 1) + "A" + (qca + 1).ToString(CultureInfo.InvariantCulture)),
                        Value       = qca,
                    };
                    cat.CategoryQuestion.PossivbleAnswers.Add(poassibleAnswer);
                }

                int questionNumber = numBerOfQuestionsArray[i];

                cat.Questions = new List <Question>();

                for (int j = 0; j < questionNumber; j++)
                {
                    id++;
                    var question = new Question
                    {
                        QuestionId       = id,
                        Description      = ("T1C" + (i + 1) + "Q" + (j + 1).ToString(CultureInfo.InvariantCulture) + "D"),
                        Help             = ("T1C" + (i + 1) + "Q" + (j + 1).ToString(CultureInfo.InvariantCulture) + "H"),
                        PossivbleAnswers = new List <PossivbleAnswer>()
                    };
                    for (int k = 0; k < numBerOfPossibleAnswersArray[i][j]; k++)
                    {
                        var answerValue = k;

                        var poassibleAnswer = new PossivbleAnswer
                        {
                            Description = ("T1C" + (i + 1) + "Q" + (j + 1).ToString(CultureInfo.InvariantCulture) + "A" + (k + 1).ToString(CultureInfo.InvariantCulture)),
                            Value       = answerValue,
                        };
                        question.PossivbleAnswers.Add(poassibleAnswer);
                    }

                    cat.Questions.Add(question);
                }

                categories.Add(cat);
            }

            template.TemplateId = this.TemplateId;
            return(template);
        }
 public override ServiceModel.Questionnaire.QuestionnaireTemplate LocalizeTemplate(QuestionnaireTemplate questionTemplate)
 {
     return(FillCategoryGeneralDescriptions(base.LocalizeTemplate(questionTemplate)));
 }
 private void TakeSurvey(QuestionnaireTemplate questionnaireTemplate)
 {
     // Asks the UI service to go to the "complete questionnaire" view, providing the selected template as
     // the context for the view.
     this.uiService.ShowView(ViewNames.CompleteQuestionnaire, questionnaireTemplate);
 }
        public override ServiceModel.Questionnaire.QuestionnaireTemplate LocalizeTemplate(QuestionnaireTemplate questionTemplate)
        {
            var loc = base.LocalizeTemplate(questionTemplate);

            loc.QuestionCategories[1].CategoryQuestion.IsHidden = true;
            return(FillCategoryGeneralDescriptions(loc));
        }
示例#26
0
 public Task <string> CreateQuestionnaireTemplateAsync(QuestionnaireTemplate newQuestionnaire)
 {
     throw new NotImplementedException();
 }
示例#27
0
        private static QuestionnaireTemplate GetSampleData_Week_One_v180616()
        {
            var text = "Move the slider to indicate your satisfaction level";

            var result = new QuestionnaireTemplate();

            result.Id = null;// "E069EF39-571C-4F65-A2FE-43A05B0BAB00";
            result.QuestionnaireSets   = new List <QuestionnaireSet>();
            result.TypeOfQuestionnaire = QuestionnaireTemplate.QuestionnaireType.OnBoarding;
            result.TypeOfGender        = QuestionnaireTemplate.GenderType.Any;
            result.IsActive            = true;

            var questionsFor1stSet = new List <Question>();

            result.QuestionnaireSets.Add(new QuestionnaireSet
            {
                Id             = null,// "E069EF39-571C-4F65-A2FE-43A05B0BAB01",
                NextButtonText = "BEGIN QUESTIONNAIRE",
                Text           = "This is an important step used to understand your relationship dynamics and to help craft your custom experience in LifeCouple.  The questionnaire will only take a few minutes.",
                Title          = "Onboarding questions",
                Questions      = questionsFor1stSet
            });

            #region 1stSet
            questionsFor1stSet.Add(new Question
            {
                Id              = null,//"a01",
                Title           = "Affection",
                Description     = @"Affection takes the loving relationship between a man and woman into the deeper realm of tender expressions. LifeCouple views affection as giving words of affirmation, acts of service, gifts, and physical touch.

Using this or your definition of affection.",
                Text            = text,
                TypeOfQuestion  = Question.QuestionType.Range,
                IndexesImpacted = new List <IndexImpact> {
                    new IndexImpact {
                        CalculationWeight = 2, TypeOfIndex = IndexTypeEnum.Overall
                    }
                },
                AnswerOptions = null,
            });

            questionsFor1stSet.Add(new Question
            {
                Id              = null,//"a02",
                Title           = "Intimacy",
                Description     = @"LifeCouple’s view is an interpersonal relationship that involves physical plus emotional intimacy. Physical intimacy is characterized by friendship, platonic love, romantic love, and enjoyable sexual activity.

Using this or your definition of a sexual relationship.",
                Text            = text,
                TypeOfQuestion  = Question.QuestionType.Range,
                IndexesImpacted = new List <IndexImpact> {
                    new IndexImpact {
                        CalculationWeight = 3, TypeOfIndex = IndexTypeEnum.Overall
                    },
                    new IndexImpact {
                        CalculationWeight = 10, TypeOfIndex = IndexTypeEnum.Intimacy
                    }
                },
                AnswerOptions = null,
            });

            questionsFor1stSet.Add(new Question
            {
                Id              = null,//"a03",
                Title           = "Emotional Connection",
                Description     = @"LifeCouple’s view is a secure attachment, 'feeling in touch', 'can I get your attention when I need it', 'can you comfort me when needed', 'do you care about my well-being even when I am not around.' 

Using this or your definition of emotional connection.",
                Text            = text,
                TypeOfQuestion  = Question.QuestionType.Range,
                IndexesImpacted = new List <IndexImpact> {
                    new IndexImpact {
                        CalculationWeight = 2, TypeOfIndex = IndexTypeEnum.Overall
                    },
                },
                AnswerOptions = null,
            });

            questionsFor1stSet.Add(new Question
            {
                Id              = null,//"a04",
                Title           = "Empathy",
                Description     = @"LifeCouple views empathy as putting yourself in the shoes of another to understand, be sensitive and share the feelings of another. 

Using this or your definition of empathy.",
                Text            = text,
                TypeOfQuestion  = Question.QuestionType.Range,
                IndexesImpacted = new List <IndexImpact> {
                    new IndexImpact {
                        CalculationWeight = 2, TypeOfIndex = IndexTypeEnum.Overall
                    },
                },
                AnswerOptions = null,
            });

            questionsFor1stSet.Add(new Question
            {
                Id              = null,//"a05",
                Title           = "Knowing and Understanding your Partner",
                Description     = @"LifeCouple views knowing your partner as learning, showing interest, taking effort on important aspects of the relationship.  Understanding is truly listening and ultimately understanding on another’s needs and what matters to each of you. 

Using this or your definition of knowing and understanding your partner.",
                Text            = text,
                TypeOfQuestion  = Question.QuestionType.Range,
                IndexesImpacted = new List <IndexImpact> {
                    new IndexImpact {
                        CalculationWeight = 2, TypeOfIndex = IndexTypeEnum.Overall
                    },
                },
                AnswerOptions = null,
            });

            questionsFor1stSet.Add(new Question
            {
                Id              = null,//"a06",
                Title           = "Admiration",
                Description     = @"Lifecouple views admiration as feeling respect, esteem and approval of one’s partner. 

Using this or your definition of admiration.",
                Text            = text,
                TypeOfQuestion  = Question.QuestionType.Range,
                IndexesImpacted = new List <IndexImpact> {
                    new IndexImpact {
                        CalculationWeight = 2, TypeOfIndex = IndexTypeEnum.Overall
                    },
                },
                AnswerOptions = null,
            });

            questionsFor1stSet.Add(new Question
            {
                Id              = null,//"a07",
                Title           = "Appreciation",
                Description     = @"Lifecouple views appreciation as thankful recognition and gratitude towards one’s partner. 

Using this or your definition of appreciation.",
                Text            = text,
                TypeOfQuestion  = Question.QuestionType.Range,
                IndexesImpacted = new List <IndexImpact> {
                    new IndexImpact {
                        CalculationWeight = 1, TypeOfIndex = IndexTypeEnum.Overall
                    },
                },
                AnswerOptions = null,
            });

            questionsFor1stSet.Add(new Question
            {
                Id              = null,//"a08",
                Title           = "Daily Chores",
                Description     = @"LifeCouple views daily chores as the management of daily, weekly and monthly duties involved in the running of a household, such as cleaning, cooking, home maintenance, shopping, and doing laundry. 

Using this or your definition of daily chores.",
                Text            = text,
                TypeOfQuestion  = Question.QuestionType.Range,
                IndexesImpacted = new List <IndexImpact> {
                    new IndexImpact {
                        CalculationWeight = 1, TypeOfIndex = IndexTypeEnum.Overall
                    },
                },
                AnswerOptions = null,
            });

            questionsFor1stSet.Add(new Question
            {
                Id              = null,//"a09",
                Title           = "Responsibilities",
                Description     = @"LifeCouple views responsibilities as larger scale aspects such as dividing how to meet all of the children’s needs, planning for major events, managing finances, etc.  

Using this or your definition of responsibilities.",
                Text            = text,
                TypeOfQuestion  = Question.QuestionType.Range,
                IndexesImpacted = new List <IndexImpact> {
                    new IndexImpact {
                        CalculationWeight = 1, TypeOfIndex = IndexTypeEnum.Overall
                    },
                },
                AnswerOptions = null,
            });

            questionsFor1stSet.Add(new Question
            {
                Id              = null,//"a10",
                Title           = "Communication",
                Description     = @"LifeCouple views communication as how you explain to your partner what you are experiencing and what your needs are and then having your partner affirm what you communicated. 

Using this or your definition of communication.",
                Text            = text,
                TypeOfQuestion  = Question.QuestionType.Range,
                IndexesImpacted = new List <IndexImpact> {
                    new IndexImpact {
                        CalculationWeight = 3, TypeOfIndex = IndexTypeEnum.Overall
                    },
                    new IndexImpact {
                        CalculationWeight = 10, TypeOfIndex = IndexTypeEnum.Communication
                    },
                },
                AnswerOptions = null,
            });

            questionsFor1stSet.Add(new Question
            {
                Id              = null,//"a11",
                Title           = "Commitment",
                Description     = @"LifeCouple views commitment as the effort to another involving love, trust, honesty, openness, other aspects that are important to both of you that includes willingness to do whatever it takes to make the relationship work. 

Using this or your definition of commitment.",
                Text            = text,
                TypeOfQuestion  = Question.QuestionType.Range,
                IndexesImpacted = new List <IndexImpact> {
                    new IndexImpact {
                        CalculationWeight = 2, TypeOfIndex = IndexTypeEnum.Overall
                    },
                },
                AnswerOptions = null,
            });

            questionsFor1stSet.Add(new Question
            {
                Id              = null,//"a12",
                Title           = "Trust",
                Description     = @"LifeCouple views trust as a decision to love, be faithful, be reliable, and make each other feel safe, both emotionally and physically; and ultimately to make your relationship a top priority. 

Using this or your definition of trust.",
                Text            = text,
                TypeOfQuestion  = Question.QuestionType.Range,
                IndexesImpacted = new List <IndexImpact> {
                    new IndexImpact {
                        CalculationWeight = 3, TypeOfIndex = IndexTypeEnum.Overall
                    },
                    new IndexImpact {
                        CalculationWeight = 10, TypeOfIndex = IndexTypeEnum.Trust
                    },
                },
                AnswerOptions = null,
            });

            questionsFor1stSet.Add(new Question
            {
                Id              = null,//"a13",
                Title           = "Healthy Conflict ",
                Description     = @"LifeCouple’s view is that when disagreements arise in a relationship, healthy conflict includes deciding to handle the conflict in cooperative manner even if both sides do not agree and not resorting to attacking, fleeing or withdrawing. 

Using this or your definition of healthy conflict.",
                Text            = text,
                TypeOfQuestion  = Question.QuestionType.Range,
                IndexesImpacted = new List <IndexImpact> {
                    new IndexImpact {
                        CalculationWeight = 3, TypeOfIndex = IndexTypeEnum.Overall
                    },
                    new IndexImpact {
                        CalculationWeight = 10, TypeOfIndex = IndexTypeEnum.ConflictResolution
                    },
                },
                AnswerOptions = null,
            });

            questionsFor1stSet.Add(new Question
            {
                Id              = null,//"a14",
                Title           = "Quality \"Couple Time\"",
                Description     = @"LifeCouple’s view is sharing quality time together that includes a shared activity and interacting together as a couple without kids or other interruptions that is meaningful for the relationship. 

Using this or your definition of couple time.",
                Text            = text,
                TypeOfQuestion  = Question.QuestionType.Range,
                IndexesImpacted = new List <IndexImpact> {
                    new IndexImpact {
                        CalculationWeight = 2, TypeOfIndex = IndexTypeEnum.Overall
                    },
                },
                AnswerOptions = null,
            });

            questionsFor1stSet.Add(new Question
            {
                Id              = null,//"a15",
                Title           = "Support",
                Description     = @"LifeCouple’s view includes supporting each other’s careers and goals as well as supporting each other in rough times. 

Using this or your definition of support.",
                Text            = text,
                TypeOfQuestion  = Question.QuestionType.Range,
                IndexesImpacted = new List <IndexImpact> {
                    new IndexImpact {
                        CalculationWeight = 2, TypeOfIndex = IndexTypeEnum.Overall
                    },
                },
                AnswerOptions = null,
            });

            questionsFor1stSet.Add(new Question
            {
                Id              = null,//"a16",
                Title           = "Respect",
                Description     = @"LifeCouple’s view includes a positive feeling and action in a way that shows that you are aware of your partner’s needs and feelings and honoring your partner by exhibiting care, concern and consideration.

Using this or your definition of respect.",
                Text            = text,
                TypeOfQuestion  = Question.QuestionType.Range,
                IndexesImpacted = new List <IndexImpact> {
                    new IndexImpact {
                        CalculationWeight = 2, TypeOfIndex = IndexTypeEnum.Overall
                    },
                },
                AnswerOptions = null,
            });

            questionsFor1stSet.Add(new Question
            {
                Id              = null,//"a17",
                Title           = "Decisions",
                Description     = @"LifeCouple’s view is that relationships have important decisions that are made over time including where to live, having children, working/staying at home with children, parenting styles. 

Using this or your definition of decisions.",
                Text            = text,
                TypeOfQuestion  = Question.QuestionType.Range,
                IndexesImpacted = new List <IndexImpact> {
                    new IndexImpact {
                        CalculationWeight = 1, TypeOfIndex = IndexTypeEnum.Overall
                    },
                },
                AnswerOptions = null,
            });

            foreach (var item in questionsFor1stSet)
            {
                if (item.TypeOfQuestion == Question.QuestionType.Range)
                {
                    item.MaxRange = item.MaxRange ?? 10;
                    item.MinRange = item.MinRange ?? 0;
                }
            }

            #endregion



            return(result);
        }
示例#28
0
        public void ValidateUserQuestionnaire(UserQuestionnaire entity, QuestionnaireTemplate questionnaireTemplate, ValidationResult validation)
        {
            if (validation.IsValid == false)
            {
                return;
            }

            if (questionnaireTemplate == null)
            {
                validation.Failures.Add(new ValidationFailure {
                    Code = ValidationErrorCode.QuestionnaireTemplateIdNotFound, EntityIdInError = entity.QuestionnaireTemplateId, EntityJsonRepresentation = Validator.GetJson(entity)
                });
                return;
            }

            if (entity.IsQuestionnaireTemplateComplete)
            {
                validation.Failures.Add(new ValidationFailure
                {
                    Code                     = ValidationErrorCode.ValidationFailure_UserQuestionnaire,
                    EntityIdInError          = entity.Id,
                    DebugMessage             = $"UserQuestionnaire with Id:{entity.Id} for QuestionnaireTemplate with Id:{questionnaireTemplate.Id} can not be updated since it is already Completed",
                    EntityJsonRepresentation = Validator.GetJson(entity)
                });
            }

            if (questionnaireTemplate.QuestionnaireSets.Count > 1)
            {
                validation.Failures.Add(new ValidationFailure
                {
                    Code                     = ValidationErrorCode.ValidationCannotBeCompleted,
                    EntityIdInError          = entity.Id,
                    DebugMessage             = $"UserQuestionnaire with Id:{entity.Id} for QuestionnaireTemplate with Id:{questionnaireTemplate.Id} have more than 1 QuestionnaireSets and there is no validation implemented for that yet",
                    EntityJsonRepresentation = Validator.GetJson(entity)
                });
            }

            if (entity.Answers != null)
            {
                foreach (var answer in entity.Answers)
                {
                    var question = questionnaireTemplate.QuestionnaireSets.First().Questions.SingleOrDefault(e => e.Id == answer.QuestionId);

                    //check if questionid exists in template
                    if (question == null)
                    {
                        validation.Failures.Add(new ValidationFailure
                        {
                            Code                     = ValidationErrorCode.ValidationFailure_UserQuestionnaire_Answers,
                            EntityIdInError          = entity.Id,
                            DebugMessage             = $"Question Id:{answer.QuestionId} in UserQuestionnaire with Id:{entity.Id} does not exist in QuestionnaireTemplate with Id:{questionnaireTemplate.Id}",
                            EntityJsonRepresentation = Validator.GetJson(entity)
                        });
                    }
                    //exists, so check if value is valid
                    else
                    {
                        switch (question.TypeOfQuestion)
                        {
                        case Question.QuestionType.Range:
                            int intValue;
                            if (int.TryParse(answer.Value, out intValue))
                            {
                                if (false == (intValue >= question.MinRange.Value && intValue <= question.MaxRange.Value))
                                {
                                    validation.Failures.Add(new ValidationFailure
                                    {
                                        Code                     = ValidationErrorCode.ValidationFailure_UserQuestionnaire_Answers_InvalidValue,
                                        EntityIdInError          = entity.Id,
                                        DebugMessage             = $"The value '{answer.Value}' for Question Id:{question.Id} in UserQuestionnaire with Id:{entity.Id} for QuestionnaireTemplate with Id:{questionnaireTemplate.Id} is out of range, valid range is '{question.MinRange}' to '{question.MaxRange}'",
                                        EntityJsonRepresentation = Validator.GetJson(entity)
                                    });
                                }
                            }
                            else
                            {
                                validation.Failures.Add(new ValidationFailure
                                {
                                    Code                     = ValidationErrorCode.ValidationFailure_UserQuestionnaire_Answers_InvalidValue,
                                    EntityIdInError          = entity.Id,
                                    DebugMessage             = $"The value '{answer.Value}' for Question Id:{question.Id} in UserQuestionnaire with Id:{entity.Id} for QuestionnaireTemplate with Id:{questionnaireTemplate.Id} is invalid, valid range is '{question.MinRange}' to '{question.MaxRange}'",
                                    EntityJsonRepresentation = Validator.GetJson(entity)
                                });
                            }

                            break;

                        default:
                            validation.Failures.Add(new ValidationFailure
                            {
                                Code                     = ValidationErrorCode.ValidationCannotBeCompleted,
                                EntityIdInError          = entity.Id,
                                DebugMessage             = $"Question Id:{question.Id} is of type '{question.TypeOfQuestion}' in QuestionnaireTemplate with Id:{questionnaireTemplate.Id} and there is no validation implemented for that yet",
                                EntityJsonRepresentation = Validator.GetJson(entity)
                            });
                            break;
                        }
                    }
                }
            }
        }
示例#29
0
        public bool ValidateQuestionnaireTemplate(QuestionnaireTemplate questionnaireTemplate)
        {
            if (questionnaireTemplate == null)
            {
                throw new ArgumentNullException("newQuestionnaire");
            }

            if (!string.IsNullOrWhiteSpace(questionnaireTemplate.Id))
            {
                throw new ArgumentOutOfRangeException($"id of entity must be empty, but it was '{questionnaireTemplate.Id}'");
            }

            if (questionnaireTemplate.QuestionnaireSets == null || questionnaireTemplate.QuestionnaireSets.Count == 0)
            {
                throw new ArgumentOutOfRangeException($"must have at least 1 QuestionnaireSets");
            }


            foreach (var qSet in questionnaireTemplate.QuestionnaireSets)
            {
                if (!string.IsNullOrWhiteSpace(qSet?.Id))
                {
                    throw new ArgumentOutOfRangeException($"id of entity must be empty, but it was '{qSet?.Id}'");
                }

                if (qSet.Questions == null || qSet.Questions.Count == 0)
                {
                    throw new ArgumentOutOfRangeException($"each QuestionnaireSets needs at least 1 Question");
                }

                foreach (var q in qSet.Questions)
                {
                    if (!string.IsNullOrWhiteSpace(q?.Id))
                    {
                        throw new ArgumentOutOfRangeException($"id of entity must be empty, but it was '{q?.Id}'");
                    }

                    if (q.TypeOfQuestion != Question.QuestionType.Range && (q.AnswerOptions == null || q.AnswerOptions.Count == 0))
                    {
                        throw new ArgumentOutOfRangeException($"each Question needs at least 1 AnswerOption");
                    }

                    if (q.TypeOfQuestion == Question.QuestionType.Range && (q.MinRange == null || q.MaxRange == null))
                    {
                        throw new ArgumentOutOfRangeException($"each Question of type { q.TypeOfQuestion.ToString()} needs to have a Min and Max range");
                    }

                    if (q.TypeOfQuestion == Question.QuestionType.Range && q.AnswerOptions != null)
                    {
                        throw new ArgumentOutOfRangeException($"each Question of type { q.TypeOfQuestion.ToString()} may NOT have any Answers");
                    }

                    if (q.TypeOfQuestion != Question.QuestionType.Range)
                    {
                        foreach (var answer in q.AnswerOptions)
                        {
                            if (string.IsNullOrWhiteSpace(answer.Text) || string.IsNullOrWhiteSpace(answer.Value))
                            {
                                throw new ArgumentOutOfRangeException($"each AnswerOption require both Text and Value to be set, question {q.Title} failed this validation");
                            }

                            if (answer.ChildQuestion != null)
                            {
                                if (!string.IsNullOrWhiteSpace(answer.ChildQuestion.Id))
                                {
                                    throw new ArgumentOutOfRangeException($"id of entity must be empty, but it was '{answer.ChildQuestion.Id}'");
                                }

                                if (answer.ChildQuestion.AnswerOptions == null || answer.ChildQuestion.AnswerOptions.Count == 0)
                                {
                                    throw new ArgumentOutOfRangeException($"each Question needs at least 1 AnswerOption");
                                }
                            }
                        }
                    }
                }
            }

            if (questionnaireTemplate.TypeOfGender == QuestionnaireTemplate.GenderType.Unknown)
            {
                throw new ArgumentOutOfRangeException($"'{questionnaireTemplate.TypeOfGender} is not a valid gender");
            }

            if (questionnaireTemplate.TypeOfQuestionnaire == QuestionnaireTemplate.QuestionnaireType.Unknown)
            {
                throw new ArgumentOutOfRangeException($"'{questionnaireTemplate.TypeOfQuestionnaire} is not a valid type");
            }
            return(true);
        }
示例#30
0
        private static QuestionnaireTemplateSummary CreateQuestionnaireTemplateSummary(QuestionnaireTemplate questionnaireTemplate)
        {
            var summary =
                new QuestionnaireTemplateSummary
            {
                Title             = questionnaireTemplate.Title,
                Description       = "Description",
                EstimatedTime     = questionnaireTemplate.Questions.Count * 2.5f,
                NumberOfQuestions = questionnaireTemplate.Questions.Count,
                TimesTaken        = 0
            };

            return(summary);
        }