public async Task <QuestionnaireResponse> PostResponse([FromBody] QuestionnaireResponse response)
        {
            var fs = new FileStorageUtils();
            await fs.WriteQuestionnaireResponse(response);

            return(response);
        }
Example #2
0
        public List <QuestionnaireResponse> getQRByPatientId(long id)
        {
            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();


            List <QuestionnaireResponse> QRs = new List <QuestionnaireResponse>();

            Bundle results = client.Search <QuestionnaireResponse>(new string[] { "subject=Patient/" + id });

            while (results != null)
            {
                foreach (var entry in results.Entry)
                {
                    QuestionnaireResponse QR = (QuestionnaireResponse)entry.Resource;
                    QRs.Add(QR);
                }

                results = client.Continue(results);
            }
            stopwatch.Stop();
            var ts = stopwatch.Elapsed;

            log.logTimeSpan("getQRByPatientId(" + id.ToString() + ")_from_server", ts, QRs.Count);

            return(QRs);
        }
        /// <summary>
        /// Deserialize JSON into a FHIR QuestionnaireResponse
        /// </summary>
        public static void DeserializeJson(this QuestionnaireResponse current, ref Utf8JsonReader reader, JsonSerializerOptions options)
        {
            string propertyName;

            while (reader.Read())
            {
                if (reader.TokenType == JsonTokenType.EndObject)
                {
                    return;
                }

                if (reader.TokenType == JsonTokenType.PropertyName)
                {
                    propertyName = reader.GetString();
                    if (Hl7.Fhir.Serialization.FhirSerializerOptions.Debug)
                    {
                        Console.WriteLine($"QuestionnaireResponse >>> QuestionnaireResponse.{propertyName}, depth: {reader.CurrentDepth}, pos: {reader.BytesConsumed}");
                    }
                    reader.Read();
                    current.DeserializeJsonProperty(ref reader, options, propertyName);
                }
            }

            throw new JsonException($"QuestionnaireResponse: invalid state! depth: {reader.CurrentDepth}, pos: {reader.BytesConsumed}");
        }
Example #4
0
        public List <string> calculateWarning(List <QuestionnaireResponse> QRs)
        {
            //TODO current assumption is that last element will be latest, check if this is the case
            QuestionnaireResponse lastQR       = QRs[QRs.Count - 1];
            QuestionnaireResponse secondLastQR = QRs[QRs.Count - 2];

            //KeyValuePair<string, float> highestDelta = new KeyValuePair<string, float>("", int.MinValue);
            List <string> triggeredCategories = new List <string>();

            foreach (var item in secondLastQR.Item)
            {
                float  valuePrev = (float)Int32.Parse(item.Answer[0].Value.ToString()); //read float??
                string keyPrev   = item.Text;

                var   correspondingItem = lastQR.Item.Where(x => x.Text == keyPrev).First();
                float valueLast         = (float)Int32.Parse(correspondingItem.Answer[0].Value.ToString());

                float delta = valueLast - valuePrev; //higher is worse
                if (delta >= threshold)
                {
                    triggeredCategories.Add(keyPrev + " +" + delta);
                }
            }

            return(triggeredCategories);
        }
Example #5
0
        public async Task CanSubmitQuestionnaireResponse()
        {
            QuestionnaireResponseItem CreateRI(int questionId, string resp)
            {
                return(new QuestionnaireResponseItem {
                    QuestionId = questionId, Response = resp
                });
            }

            var response = await _client.GetAsync("/api/questionnaire/getquestionnaire/Questionnaire1");

            Questionnaire r = await response.Content.ReadAsAsync <Questionnaire>();

            var qr = new QuestionnaireResponse
            {
                QuestionnaireName = r.Name,
                SubmitTimeStamp   = 0L,
                Responses         = new List <QuestionnaireResponseItem> {
                    CreateRI(1, "Tony"),
                    CreateRI(2, "1"),
                    CreateRI(3, "3"),
                    CreateRI(4, "Orange choclate"),
                    CreateRI(5, "Whaaat!")
                }
            };
            var r1 = await _client.PostAsJsonAsync("/api/questionnaire/postresponse", qr);

            r1.EnsureSuccessStatusCode();
            var c1 = await r1.Content.ReadAsStringAsync();

            Debug.WriteLine($"@@@ {c1}");
        }
Example #6
0
        public override Task <QuestionnaireResponse> GetQuestionnaire(Empty request, ServerCallContext context)
        {
            var resp = new QuestionnaireResponse()
            {
                Result = new QuestionnaireResponse.Types.QuestionnairePayload()
            };

            return(Task.FromResult(resp));
        }
        public async Task <QuestionnaireResponse> GetQuestionnaireAsync()
        {
            Question[] questions = await _questionnaireService.GetQuestionsAsync();

            var result = new QuestionnaireResponse {
                Questionnaire = _mapper.Map <QuestionModel[]>(questions)
            };

            return(result);
        }
Example #8
0
        public List <string> calculateFlag(List <QuestionnaireResponse> QRs)
        {
            //find QRs matching "qid" string
            List <QuestionnaireResponse> matchingQRs = new List <QuestionnaireResponse>();

            foreach (var QR in QRs)
            {
                if (QR.Questionnaire.Reference == qid)
                {
                    matchingQRs.Add(QR);
                }
            }

            //find latest and second latest of matched QRs
            QuestionnaireResponse lastQR       = null;
            QuestionnaireResponse secondLastQR = null;

            foreach (var QR in matchingQRs)
            {
                DateTime date = DateTime.Parse(QR.Authored);
                if (lastQR == null || DateTime.Parse(lastQR.Authored) < date)
                {
                    secondLastQR = lastQR;
                    lastQR       = QR;
                }
            }

            if (lastQR != null && secondLastQR != null)
            {
                KeyValuePair <string, float> highestDelta = new KeyValuePair <string, float>("", int.MinValue);
                foreach (var item in secondLastQR.Item)
                {
                    float  valuePrev = (float)Int32.Parse(item.Answer[0].Value.ToString());
                    string keyPrev   = item.Text;

                    var   correspondingItem = lastQR.Item.Where(x => x.Text == keyPrev).First();
                    float valueLast         = (float)Int32.Parse(correspondingItem.Answer[0].Value.ToString());

                    float delta = valueLast - valuePrev; //higher is worse

                    if (delta >= threshold)
                    {
                        if (delta > highestDelta.Value)
                        {
                            highestDelta = new KeyValuePair <string, float>(keyPrev + " +" + delta + " (" + valueLast + ")", delta);
                        }
                    }
                }
                return(new List <string>(new string[] { highestDelta.Key }));
            }

            return(new List <string>(new string[] { "" }));
        }
        public List <string> calculateWarning(List <QuestionnaireResponse> QRs)
        {
            //find QRs matching "qid" string
            List <QuestionnaireResponse> matchingQRs = new List <QuestionnaireResponse>();

            if (QRs != null)
            {
                foreach (var QR in QRs)
                {
                    if (QR.Questionnaire.Reference == qid)
                    {
                        matchingQRs.Add(QR);
                    }
                }
            }


            //find latest and second latest of matched QRs
            QuestionnaireResponse lastQR = null;

            if (matchingQRs.Count > 0)
            {
                foreach (var QR in matchingQRs)
                {
                    DateTime date = DateTime.Parse(QR.Authored);
                    if (lastQR == null || DateTime.Parse(lastQR.Authored) < date)
                    {
                        lastQR = QR;
                    }
                }
            }

            List <string> triggeredCategories = new List <string>();

            if (lastQR != null)
            {
                foreach (var item in lastQR.Item)
                {
                    if (item.Text == "Suicidal thoughts")
                    {
                        float value = (float)Int32.Parse(item.Answer[0].Value.ToString());
                        if (value >= threshold)
                        {
                            triggeredCategories.Add("Suicidal thoughts " + value.ToString());
                            return(triggeredCategories);
                        }
                    }
                }
            }

            return(triggeredCategories);
        }
Example #10
0
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (Request.QueryString["Type"] != null)
                {
                    switch (Request.QueryString["Type"])
                    {
                    case "QuestionnaireResponse":
                        if (Request.QueryString["PQID"] != null)
                        {
                            QuestionnaireResponse report = new QuestionnaireResponse();
                            securityAgent = new CryptoProvider();
                            report.Parameters["@PQID"].Value = securityAgent.decryptText(Request.QueryString["PQID"].Replace(" ", "+"));
                            ReportViewerControl.Report       = report;
                        }
                        break;

                    case "PatientReport":
                        if (Request.QueryString["PatientID"] != null)
                        {
                            ConsolidatedReport report = new ConsolidatedReport();
                            securityAgent = new CryptoProvider();
                            report.Parameters["@PatientID"].Value = securityAgent.decryptText(Request.QueryString["PatientID"].Replace(" ", "+"));
                            ReportViewerControl.Report            = report;
                        }
                        break;

                    case "VisitDetails":
                        if (Request.QueryString["PatientID"] != null)
                        {
                            TestSummaryReport report = new TestSummaryReport();
                            securityAgent = new CryptoProvider();
                            report.Parameters["@PatientID"].Value = securityAgent.decryptText(Request.QueryString["PatientID"].Replace(" ", "+"));
                            ReportViewerControl.Report            = report;
                        }
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                CommonHelpers.writeLogToFile("Page_Load: ReportViewer.aspx", ex.Message);
            }
        }
Example #11
0
        public int calculateUrgency(List <QuestionnaireResponse> QRs)
        {
            //find QRs matching "qid" string
            List <QuestionnaireResponse> matchingQRs = new List <QuestionnaireResponse>();

            if (QRs != null)
            {
                foreach (var QR in QRs)
                {
                    if (QR.Questionnaire.Reference == qid)
                    {
                        matchingQRs.Add(QR);
                    }
                }
            }


            //find latest and second latest of matched QRs
            QuestionnaireResponse lastQR = null;

            if (matchingQRs.Count > 0)
            {
                foreach (var QR in matchingQRs)
                {
                    DateTime date = DateTime.Parse(QR.Authored);
                    if (lastQR == null || DateTime.Parse(lastQR.Authored) < date)
                    {
                        lastQR = QR;
                    }
                }
            }

            int sum = 0;

            if (lastQR != null)
            {
                foreach (var item in lastQR.Item)
                {
                    int value = Int32.Parse(item.Answer[0].Value.ToString());
                    sum += value;
                }
            }
            return(sum);
        }
Example #12
0
        public List <QuestionnaireResults> ProcessAttendeeResults()
        {
            var ResultList = new List <QuestionnaireResults>();
            //First get the Primary Answers
            IRequestMeta RequestMeta = IRequestMetaFactory.CreateRequestMeta().Set($"{FHIRAllTypes.QuestionnaireResponse.GetLiteral()}/{_PrimaryQuestionnaireResponseAnswerResourceId}");
            var          Answers     = this.IResourceServices.GetRead(_PrimaryQuestionnaireResponseAnswerResourceId, RequestMeta);

            if (Answers.SuccessfulTransaction && Answers.ResourceResult != null && Answers.ResourceResult is QuestionnaireResponse QuestionnaireResponseAnswers)
            {
                //Now get the Attendee's answers
                string       SearchQuery = $"questionnaire=Questionnaire/{_QuestionnaireResourceId}";
                IRequestMeta RequestMetaQuestionnaireResource = IRequestMetaFactory.CreateRequestMeta().Set($"{FHIRAllTypes.QuestionnaireResponse.GetLiteral()}?{SearchQuery}");
                var          AttendeeAnswers = this.IResourceServices.GetSearch(RequestMetaQuestionnaireResource);
                if (AttendeeAnswers.SuccessfulTransaction && AttendeeAnswers.ResourceResult != null && AttendeeAnswers.ResourceResult is Bundle AttendeeAnswersBundle)
                {
                    foreach (var Entry in AttendeeAnswersBundle.Entry)
                    {
                        QuestionnaireResponse QuestionnaireResponseAttendee = Entry.Resource as QuestionnaireResponse;
                        if (QuestionnaireResponseAttendee.Source != null && !string.IsNullOrWhiteSpace(QuestionnaireResponseAttendee.Source.Reference))
                        {
                            if (QuestionnaireResponseAttendee.Source.Url != null)
                            {
                            }
                            else
                            {
                                string Ref = QuestionnaireResponseAttendee.Source.Reference;
                            }
                        }

                        QuestionnaireResults QuestionnaireResults = QuestionnaireResponseChecker.Check(QuestionnaireResponseAnswers, QuestionnaireResponseAttendee);
                        ResultList.Add(QuestionnaireResults);
                    }
                }
            }
            else
            {
                throw new Exception($"Could not resolve the primary Answer QuestionnaireResponse resource with id = {_PrimaryQuestionnaireResponseAnswerResourceId}");
            }
            return(ResultList);
        }
        private QuestionnaireResponse createPatientQuestionReponses(FhirDateTime date, Patient patient, ServiceRequest order)
        {
            var patientQuestions = new QuestionnaireResponse
            {
                Authored = date.ToString(),
                Subject  = order.GlobalURLReference(client.UseFullResourcePath),
                Source   = patient.GlobalURLReference(client.UseFullResourcePath),
                Status   = QuestionnaireResponse.QuestionnaireResponseStatus.Completed,
                Item     = new List <QuestionnaireResponse.ItemComponent>()
                {
                    new QuestionnaireResponse.ItemComponent()
                    {
                        LinkId     = $"https://dia.medicover.com/serviceknowledgebase/question/LastMeal",
                        Definition = $"https://dia.medicover.com/serviceknowledgebase/question/LastMeal",
                        Text       = "Time from last meal",
                        Answer     = new List <QuestionnaireResponse.AnswerComponent> {
                            new QuestionnaireResponse.AnswerComponent {
                                Value = new Quantity(2, "h")
                            }
                        }
                    },
                    new QuestionnaireResponse.ItemComponent {
                        LinkId     = $"https://dia.medicover.com/serviceknowledgebase/question/Nice",
                        Definition = $"https://dia.medicover.com/serviceknowledgebase/question/Nice",
                        Text       = "Nice enviroment?",
                        Answer     = new List <QuestionnaireResponse.AnswerComponent> {
                            new QuestionnaireResponse.AnswerComponent {
                                Value = new FhirBoolean(true)
                            }
                        }
                    }
                }
            };

            return(client.Create(patientQuestions));
        }
        /// <summary>
        /// Deserialize JSON into a FHIR QuestionnaireResponse
        /// </summary>
        public static void DeserializeJsonProperty(this QuestionnaireResponse current, ref Utf8JsonReader reader, JsonSerializerOptions options, string propertyName)
        {
            switch (propertyName)
            {
            case "identifier":
                current.Identifier = new Hl7.Fhir.Model.Identifier();
                ((Hl7.Fhir.Model.Identifier)current.Identifier).DeserializeJson(ref reader, options);
                break;

            case "basedOn":
                if ((reader.TokenType != JsonTokenType.StartArray) || (!reader.Read()))
                {
                    throw new JsonException($"QuestionnaireResponse error reading 'basedOn' expected StartArray, found {reader.TokenType}! depth: {reader.CurrentDepth}, pos: {reader.BytesConsumed}");
                }

                current.BasedOn = new List <ResourceReference>();

                while (reader.TokenType != JsonTokenType.EndArray)
                {
                    Hl7.Fhir.Model.ResourceReference v_BasedOn = new Hl7.Fhir.Model.ResourceReference();
                    v_BasedOn.DeserializeJson(ref reader, options);
                    current.BasedOn.Add(v_BasedOn);

                    if (!reader.Read())
                    {
                        throw new JsonException($"QuestionnaireResponse error reading 'basedOn' array, read failed! depth: {reader.CurrentDepth}, pos: {reader.BytesConsumed}");
                    }
                    if (reader.TokenType == JsonTokenType.EndObject)
                    {
                        reader.Read();
                    }
                }

                if (current.BasedOn.Count == 0)
                {
                    current.BasedOn = null;
                }
                break;

            case "partOf":
                if ((reader.TokenType != JsonTokenType.StartArray) || (!reader.Read()))
                {
                    throw new JsonException($"QuestionnaireResponse error reading 'partOf' expected StartArray, found {reader.TokenType}! depth: {reader.CurrentDepth}, pos: {reader.BytesConsumed}");
                }

                current.PartOf = new List <ResourceReference>();

                while (reader.TokenType != JsonTokenType.EndArray)
                {
                    Hl7.Fhir.Model.ResourceReference v_PartOf = new Hl7.Fhir.Model.ResourceReference();
                    v_PartOf.DeserializeJson(ref reader, options);
                    current.PartOf.Add(v_PartOf);

                    if (!reader.Read())
                    {
                        throw new JsonException($"QuestionnaireResponse error reading 'partOf' array, read failed! depth: {reader.CurrentDepth}, pos: {reader.BytesConsumed}");
                    }
                    if (reader.TokenType == JsonTokenType.EndObject)
                    {
                        reader.Read();
                    }
                }

                if (current.PartOf.Count == 0)
                {
                    current.PartOf = null;
                }
                break;

            case "questionnaire":
                if (reader.TokenType == JsonTokenType.Null)
                {
                    current.QuestionnaireElement = new Canonical();
                    reader.Skip();
                }
                else
                {
                    current.QuestionnaireElement = new Canonical(reader.GetString());
                }
                break;

            case "_questionnaire":
                if (current.QuestionnaireElement == null)
                {
                    current.QuestionnaireElement = new Canonical();
                }
                ((Hl7.Fhir.Model.Element)current.QuestionnaireElement).DeserializeJson(ref reader, options);
                break;

            case "status":
                if (reader.TokenType == JsonTokenType.Null)
                {
                    current.StatusElement = new Code <Hl7.Fhir.Model.QuestionnaireResponse.QuestionnaireResponseStatus>();
                    reader.Skip();
                }
                else
                {
                    current.StatusElement = new Code <Hl7.Fhir.Model.QuestionnaireResponse.QuestionnaireResponseStatus>(Hl7.Fhir.Utility.EnumUtility.ParseLiteral <Hl7.Fhir.Model.QuestionnaireResponse.QuestionnaireResponseStatus>(reader.GetString()));
                }
                break;

            case "_status":
                if (current.StatusElement == null)
                {
                    current.StatusElement = new Code <Hl7.Fhir.Model.QuestionnaireResponse.QuestionnaireResponseStatus>();
                }
                ((Hl7.Fhir.Model.Element)current.StatusElement).DeserializeJson(ref reader, options);
                break;

            case "subject":
                current.Subject = new Hl7.Fhir.Model.ResourceReference();
                ((Hl7.Fhir.Model.ResourceReference)current.Subject).DeserializeJson(ref reader, options);
                break;

            case "encounter":
                current.Encounter = new Hl7.Fhir.Model.ResourceReference();
                ((Hl7.Fhir.Model.ResourceReference)current.Encounter).DeserializeJson(ref reader, options);
                break;

            case "authored":
                if (reader.TokenType == JsonTokenType.Null)
                {
                    current.AuthoredElement = new FhirDateTime();
                    reader.Skip();
                }
                else
                {
                    current.AuthoredElement = new FhirDateTime(reader.GetString());
                }
                break;

            case "_authored":
                if (current.AuthoredElement == null)
                {
                    current.AuthoredElement = new FhirDateTime();
                }
                ((Hl7.Fhir.Model.Element)current.AuthoredElement).DeserializeJson(ref reader, options);
                break;

            case "author":
                current.Author = new Hl7.Fhir.Model.ResourceReference();
                ((Hl7.Fhir.Model.ResourceReference)current.Author).DeserializeJson(ref reader, options);
                break;

            case "source":
                current.Source = new Hl7.Fhir.Model.ResourceReference();
                ((Hl7.Fhir.Model.ResourceReference)current.Source).DeserializeJson(ref reader, options);
                break;

            case "item":
                if ((reader.TokenType != JsonTokenType.StartArray) || (!reader.Read()))
                {
                    throw new JsonException($"QuestionnaireResponse error reading 'item' expected StartArray, found {reader.TokenType}! depth: {reader.CurrentDepth}, pos: {reader.BytesConsumed}");
                }

                current.Item = new List <QuestionnaireResponse.ItemComponent>();

                while (reader.TokenType != JsonTokenType.EndArray)
                {
                    Hl7.Fhir.Model.QuestionnaireResponse.ItemComponent v_Item = new Hl7.Fhir.Model.QuestionnaireResponse.ItemComponent();
                    v_Item.DeserializeJson(ref reader, options);
                    current.Item.Add(v_Item);

                    if (!reader.Read())
                    {
                        throw new JsonException($"QuestionnaireResponse error reading 'item' array, read failed! depth: {reader.CurrentDepth}, pos: {reader.BytesConsumed}");
                    }
                    if (reader.TokenType == JsonTokenType.EndObject)
                    {
                        reader.Read();
                    }
                }

                if (current.Item.Count == 0)
                {
                    current.Item = null;
                }
                break;

            // Complex: QuestionnaireResponse, Export: QuestionnaireResponse, Base: DomainResource
            default:
                ((Hl7.Fhir.Model.DomainResource)current).DeserializeJsonProperty(ref reader, options, propertyName);
                break;
            }
        }
 public ProjectQuestionnaireResponse(Project project, QuestionnaireResponse questionnaireResponse)
 {
     this.project = project;
     this.QuestionnaireResponse = questionnaireResponse;
 }
        /// <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);
            }
        }
        /// <summary>
        /// Serialize a FHIR QuestionnaireResponse into JSON
        /// </summary>
        public static void SerializeJson(this QuestionnaireResponse current, Utf8JsonWriter writer, JsonSerializerOptions options, bool includeStartObject = true)
        {
            if (includeStartObject)
            {
                writer.WriteStartObject();
            }
            writer.WriteString("resourceType", "QuestionnaireResponse");
            // Complex: QuestionnaireResponse, Export: QuestionnaireResponse, Base: DomainResource (DomainResource)
            ((Hl7.Fhir.Model.DomainResource)current).SerializeJson(writer, options, false);

            if (current.Identifier != null)
            {
                writer.WritePropertyName("identifier");
                current.Identifier.SerializeJson(writer, options);
            }

            if ((current.BasedOn != null) && (current.BasedOn.Count != 0))
            {
                writer.WritePropertyName("basedOn");
                writer.WriteStartArray();
                foreach (ResourceReference val in current.BasedOn)
                {
                    val.SerializeJson(writer, options, true);
                }
                writer.WriteEndArray();
            }

            if ((current.PartOf != null) && (current.PartOf.Count != 0))
            {
                writer.WritePropertyName("partOf");
                writer.WriteStartArray();
                foreach (ResourceReference val in current.PartOf)
                {
                    val.SerializeJson(writer, options, true);
                }
                writer.WriteEndArray();
            }

            if (current.QuestionnaireElement != null)
            {
                if (!string.IsNullOrEmpty(current.QuestionnaireElement.Value))
                {
                    writer.WriteString("questionnaire", current.QuestionnaireElement.Value);
                }
                if (current.QuestionnaireElement.HasExtensions() || (!string.IsNullOrEmpty(current.QuestionnaireElement.ElementId)))
                {
                    JsonStreamUtilities.SerializeExtensionList(writer, options, "_questionnaire", false, current.QuestionnaireElement.Extension, current.QuestionnaireElement.ElementId);
                }
            }

            writer.WriteString("status", Hl7.Fhir.Utility.EnumUtility.GetLiteral(current.StatusElement.Value));

            if (current.Subject != null)
            {
                writer.WritePropertyName("subject");
                current.Subject.SerializeJson(writer, options);
            }

            if (current.Encounter != null)
            {
                writer.WritePropertyName("encounter");
                current.Encounter.SerializeJson(writer, options);
            }

            if (current.AuthoredElement != null)
            {
                if (!string.IsNullOrEmpty(current.AuthoredElement.Value))
                {
                    writer.WriteString("authored", current.AuthoredElement.Value);
                }
                if (current.AuthoredElement.HasExtensions() || (!string.IsNullOrEmpty(current.AuthoredElement.ElementId)))
                {
                    JsonStreamUtilities.SerializeExtensionList(writer, options, "_authored", false, current.AuthoredElement.Extension, current.AuthoredElement.ElementId);
                }
            }

            if (current.Author != null)
            {
                writer.WritePropertyName("author");
                current.Author.SerializeJson(writer, options);
            }

            if (current.Source != null)
            {
                writer.WritePropertyName("source");
                current.Source.SerializeJson(writer, options);
            }

            if ((current.Item != null) && (current.Item.Count != 0))
            {
                writer.WritePropertyName("item");
                writer.WriteStartArray();
                foreach (QuestionnaireResponse.ItemComponent val in current.Item)
                {
                    val.SerializeJson(writer, options, true);
                }
                writer.WriteEndArray();
            }

            if (includeStartObject)
            {
                writer.WriteEndObject();
            }
        }
        public ProgressionRepresentation aggregate(List <QuestionnaireResponse> QRs)
        {
            //find QRs matching "qid" string
            List <QuestionnaireResponse> matchingQRs = new List <QuestionnaireResponse>();

            foreach (var QR in QRs)
            {
                if (QR.Questionnaire.Reference == qid)
                {
                    matchingQRs.Add(QR);
                }
            }

            //find latest and second latest of matched QRs
            QuestionnaireResponse lastQR       = null;
            QuestionnaireResponse secondLastQR = null;

            foreach (var QR in matchingQRs)
            {
                DateTime date = DateTime.Parse(QR.Authored);
                if (lastQR == null || DateTime.Parse(lastQR.Authored) < date)
                {
                    secondLastQR = lastQR;
                    lastQR       = QR;
                }
            }

            //calculate sums
            int sumLatest       = 0;
            int sumSecondLatest = 0;

            if (lastQR != null && secondLastQR != null)
            {
                foreach (var item in lastQR.Item)
                {
                    var valueElement = item.Answer[0].Value;
                    int value        = Int32.Parse(valueElement.ToString()); // getting the Value property from the Element class was problematic
                    sumLatest += value;
                }

                foreach (var item in secondLastQR.Item)
                {
                    var valueElement = item.Answer[0].Value;
                    int value        = Int32.Parse(valueElement.ToString()); // getting the Value property from the Element class was problematic
                    sumSecondLatest += value;
                }

                //compare
                float delta = sumSecondLatest - sumLatest;
                if (delta < -threshold)
                {
                    //sum going up => condition declining
                    return(ProgressionRepresentation.declining);
                }
                else if ((delta >= -threshold) && (delta <= threshold))
                {
                    return(ProgressionRepresentation.steady);
                }
                else if (delta > threshold)
                {
                    return(ProgressionRepresentation.improving);
                }
                return(ProgressionRepresentation.error);
            }
            else
            {
                return(ProgressionRepresentation.blank);
            }
        }
Example #19
0
        public static List <QuestionnaireResponse> ParseResponses(Dictionary <string, string> formCollection)
        {
            List <QuestionnaireResponse> questionnaireResponses = new List <QuestionnaireResponse>();

            foreach (string key in formCollection.Keys)
            {
                if (key.Contains("."))
                {
                    string[] keyValues = key.Split('.');
                    switch (keyValues[0])
                    {
                    case "Radio":
                    case "DropDown":
                        string[] values = formCollection[key].Split('.');
                        int      questionnaireItemId       = Convert.ToInt32(keyValues[1]);
                        int      questionnaireItemOptionId = Convert.ToInt32(values[0]);
                        double   responseValue             = Convert.ToDouble(values[1]);
                        QuestionnaireResponse response     = new QuestionnaireResponse()
                        {
                            Item = new PCHI.Model.Questionnaire.QuestionnaireItem()
                            {
                                Id = questionnaireItemId
                            },
                            Option = new QuestionnaireItemOption()
                            {
                                Id = questionnaireItemOptionId
                            },
                            ResponseValue = responseValue
                        };
                        questionnaireResponses.Add(response);
                        break;

                    case "Slider":
                        questionnaireItemId       = Convert.ToInt32(keyValues[1]);
                        responseValue             = Convert.ToDouble(formCollection[key]);
                        questionnaireItemOptionId = Convert.ToInt32(keyValues[3]);
                        response = new QuestionnaireResponse()
                        {
                            Item = new PCHI.Model.Questionnaire.QuestionnaireItem()
                            {
                                Id = questionnaireItemId
                            },
                            Option = new QuestionnaireItemOption()
                            {
                                Id = questionnaireItemOptionId
                            },
                            ResponseValue = responseValue,
                            ResponseText  = null
                        };
                        questionnaireResponses.Add(response);
                        break;

                    case "CheckBox":
                        values = formCollection[key].Split('.');
                        questionnaireItemId       = Convert.ToInt32(keyValues[1]);
                        questionnaireItemOptionId = Convert.ToInt32(values[0]);
                        string responseText;
                        if (Double.TryParse(values[1], out responseValue))
                        {
                            response = new QuestionnaireResponse()
                            {
                                Item = new PCHI.Model.Questionnaire.QuestionnaireItem()
                                {
                                    Id = questionnaireItemId
                                },
                                Option = new QuestionnaireItemOption()
                                {
                                    Id = questionnaireItemOptionId
                                },
                                ResponseValue = responseValue
                            }
                        }
                        ;
                        else
                        {
                            responseText = values[1];
                            response     = new QuestionnaireResponse()
                            {
                                Item = new PCHI.Model.Questionnaire.QuestionnaireItem()
                                {
                                    Id = questionnaireItemId
                                },
                                Option = new QuestionnaireItemOption()
                                {
                                    Id = questionnaireItemOptionId
                                },
                                ResponseText = responseText
                            };
                        }


                        questionnaireResponses.Add(response);
                        break;

                    case "DatePicker":
                    case "TextBox":
                    case "TextArea":
                        questionnaireItemId       = Convert.ToInt32(keyValues[1]);
                        questionnaireItemOptionId = Convert.ToInt32(keyValues[3]);
                        responseText = formCollection[key];
                        response     = new QuestionnaireResponse()
                        {
                            Item = new PCHI.Model.Questionnaire.QuestionnaireItem()
                            {
                                Id = questionnaireItemId
                            },
                            Option = new QuestionnaireItemOption()
                            {
                                Id = questionnaireItemOptionId
                            },
                            ResponseText  = responseText,
                            ResponseValue = null
                        };
                        questionnaireResponses.Add(response);
                        break;

                    case "HiddenCheckBox":
                        values = formCollection[key].Split('.');
                        questionnaireItemId       = Convert.ToInt32(keyValues[1]);
                        questionnaireItemOptionId = Convert.ToInt32(keyValues[3]);
                        responseText = keyValues[2] + "." + values[0];
                        response     = new QuestionnaireResponse()
                        {
                            Item = new PCHI.Model.Questionnaire.QuestionnaireItem()
                            {
                                Id = questionnaireItemId
                            },
                            Option = new QuestionnaireItemOption()
                            {
                                Id = questionnaireItemOptionId
                            },
                            ResponseText  = responseText,
                            ResponseValue = null
                        };
                        questionnaireResponses.Add(response);
                        break;

                    default:
                        // TODO for the other option types there are
                        break;
                    }
                }
            }

            return(questionnaireResponses);
        }
        public static QuestionnaireResults Check(QuestionnaireResponse Answers, QuestionnaireResponse Response)
        {
            var QuestionnaireResults = new QuestionnaireResults();

            return(ProcessItems(Answers.Item, Response.Item, QuestionnaireResults));
        }