private static void LoadOptionGroupsIntoItem(XmlElement i, ref QuestionnaireItem item) { foreach (XmlElement og in i.GetElementsByTagName("OptionGroup")) { QuestionnaireItemOptionGroup opgrp = new QuestionnaireItemOptionGroup(); LoadOptionGroup(og, ref opgrp); } }
private QuestionnaireItemOptionGroup AddOptionGroupToItem(QuestionnaireItem item, MyDictionary options, int rangeStep, QuestionnaireResponseType type) { QuestionnaireItemOptionGroup qog = new QuestionnaireItemOptionGroup(); qog.OrderInItem = item.OptionGroups.Count + 1; qog.RangeStep = rangeStep; qog.ResponseType = type; foreach (int v in options.Keys) { qog.Options.Add(new QuestionnaireItemOption() { Text = options[v].Text, Value = v, Group = qog, Action = options[v].Action }); } qog.Item = item; item.OptionGroups.Add(qog); return(qog); }
private static void LoadOptionGroup(XmlElement og, ref QuestionnaireItemOptionGroup optgrp) { string rtype = GetNodeValue(og, "ResponseType"); switch (rtype) { case "ConditionalItem": optgrp.ResponseType = QuestionnaireResponseType.ConditionalItem; break; case "List": optgrp.ResponseType = QuestionnaireResponseType.List; break; case "MultiSelect": optgrp.ResponseType = QuestionnaireResponseType.MultiSelect; break; case "Range": optgrp.ResponseType = QuestionnaireResponseType.Range; break; case "Text": optgrp.ResponseType = QuestionnaireResponseType.Text; break; } optgrp.RangeStep = Convert.ToDouble(GetNodeValue(og, "RangeStep")); foreach (XmlElement o in og.GetElementsByTagName("Option")) { QuestionnaireItemOption opt = new QuestionnaireItemOption(); opt.Text = GetNodeValue(o, "Text"); opt.Text = GetNodeValue(o, "Value"); opt.Action = GetNodeValue(o, "Action"); opt.DisplayId = GetNodeValue(o, "DisplayId"); opt.ActionId = GetNodeValue(o, "ActionID"); optgrp.Options.Add(opt); } }
/// <summary> /// Saves the given <see cref="QuestionnaireResponse"/> to the database /// Existing answers are overwritten /// </summary> /// <param name="questionnaireId">The Id of the questionnaire to save the response for</param> /// <param name="groupId">The Id of the group for which to save the responses</param> /// <param name="questionnaireCompleted">Indicates whether or user has filled in all responses and the Questionnaire is now completed</param> /// <param name="responses">A list of <see cref="QuestionnaireResponse"/> to save</param> /// <param name="status">The optional status to set the QuestionnaireUserResponse group to. If not given the status will be adjusted based upon the QuestionnaireCompleted flag and if there are any responses</param> /// <exception cref="ArgumentException">Thrown when either the questionniare or group has not been found</exception> public void SaveQuestionnaireResponse(int questionnaireId, int groupId, bool questionnaireCompleted, List <QuestionnaireResponse> responses, QuestionnaireUserResponseGroupStatus?status = null) { Questionnaire questionnaire = this.context.Questionnaires.Where(q => q.Id == questionnaireId).SingleOrDefault(); QuestionnaireUserResponseGroup group = this.context.QuestionnaireUserResponseGroups.Where(u => u.Questionnaire.Name == questionnaire.Name && u.Id == groupId).Include(u => u.Questionnaire).Include(u => u.Patient).SingleOrDefault(); if (group == null) { throw new ArgumentException("No group has been found for the given User and Questionnaire"); } if (questionnaire == null) { throw new ArgumentException("Questionniare doesn't exist"); } if (!group.StartTime.HasValue) { group.StartTime = DateTime.Now; } if (questionnaireCompleted) { group.Completed = true; group.Status = QuestionnaireUserResponseGroupStatus.Completed; group.DateTimeCompleted = DateTime.Now; } else if (responses.Count > 0) { group.Status = QuestionnaireUserResponseGroupStatus.InProgress; } if (status.HasValue) { group.Status = status.Value; } if (responses.Count > 0) { List <QuestionnaireResponse> existingResponses = this.context.QuestionnaireResponses.Where(r => r.QuestionnaireUserResponseGroup.Id == groupId).Include(r => r.Item).ToList(); if (group.Questionnaire.Id != questionnaireId) { // delete all existing answers as we have a new questionnaire Id group.Questionnaire = this.context.Questionnaires.Where(q => q.Id == questionnaireId).Single(); } // Get all option groups that multi-select enabled List <int> multiSelectGroupsIds = this.context.QuestionnaireItemOptionGroups.Where(g => g.Item.Section.Questionnaire.Id == questionnaireId && g.ResponseType == QuestionnaireResponseType.MultiSelect).Select(g => g.Id).ToList(); // Load all the relevant options to increase performance this.context.QuestionnaireItemOptions.Where(o => o.Group.Item.Section.Questionnaire.Id == questionnaireId).Load(); foreach (QuestionnaireResponse response in responses) { // QuestionnaireItem item = this.context.QuestionnaireElements.OfType<QuestionnaireItem>().Where(q => q.Id == response.Item.Id).Include(i => i.OptionGroups.Select(g => g.Options)).Single(); QuestionnaireItemOptionGroup optionGroup = response.Option == null ? null : this.context.QuestionnaireItemOptions.Where(o => o.Id == response.Option.Id).Select(o => o.Group).Single(); if (multiSelectGroupsIds.Contains(optionGroup.Id)) { response.QuestionnaireUserResponseGroup = group; response.Item = response.Item == null ? null : this.context.QuestionnaireElements.OfType <QuestionnaireItem>().Where(el => el.Id == response.Item.Id).SingleOrDefault(); response.Option = response.Option == null ? null : this.context.QuestionnaireItemOptions.Where(o => o.Id == response.Option.Id).SingleOrDefault(); if (response.Item == null && response.Option == null) { throw new ArgumentNullException("Both Item and Option are null in the QuestionnaireResponse and this is not allowed"); } this.context.QuestionnaireResponses.Add(response); } else { QuestionnaireResponse existing = existingResponses.Where(r => r.Item.Id == response.Item.Id && r.Id == optionGroup.Id).SingleOrDefault(); if (existing != null) { existing.Option = response.Option == null ? null : this.context.QuestionnaireItemOptions.Where(o => o.Id == response.Option.Id).SingleOrDefault(); existing.ResponseValue = response.ResponseValue; existing.ResponseText = response.ResponseText; this.context.Entry(existing).State = EntityState.Modified; } else { response.QuestionnaireUserResponseGroup = group; response.Item = response.Item == null ? null : this.context.QuestionnaireElements.OfType <QuestionnaireItem>().Where(el => el.Id == response.Item.Id).SingleOrDefault(); response.Option = response.Option == null ? null : this.context.QuestionnaireItemOptions.Where(o => o.Id == response.Option.Id).SingleOrDefault(); if (response.Item == null && response.Option == null) { throw new ArgumentNullException("Both Item and Option are null in the QuestionnaireResponse and this is not allowed"); } this.context.QuestionnaireResponses.Add(response); } } } existingResponses.Where(r => this.context.Entry(r).State == EntityState.Unchanged).ToList().ForEach(o => this.context.Entry(o).State = EntityState.Deleted); } try { this.context.SaveChanges(); } catch (DbEntityValidationException e) { string errorResult = string.Empty; foreach (var eve in e.EntityValidationErrors) { errorResult += "Entity of type \" " + eve.Entry.Entity.GetType().Name + "\" in state \"" + eve.Entry.State + "\" has the following validation errors: \n"; foreach (var ve in eve.ValidationErrors) { errorResult += "- Property: \"" + ve.PropertyName + "\", Error: \"" + ve.ErrorMessage + "\" \n"; } } throw new DbEntityValidationException(errorResult, e); } }