Exemplo n.º 1
0
 private static void LoadOptionGroupsIntoItem(XmlElement i, ref QuestionnaireItem item)
 {
     foreach (XmlElement og in i.GetElementsByTagName("OptionGroup"))
     {
         QuestionnaireItemOptionGroup opgrp = new QuestionnaireItemOptionGroup();
         LoadOptionGroup(og, ref opgrp);
     }
 }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
            }
        }