Beispiel #1
0
 /// <summary>
 /// Updates the Scheduled QuestionnaireDate
 /// </summary>
 /// <param name="scheduledQuestionnaire">The schedules questionnaire to update</param>
 public void UpdateScheduleQuestionnaireDate(ScheduledQuestionnaireDate scheduledQuestionnaire)
 {
     this.context.Entry(scheduledQuestionnaire).State = EntityState.Modified;
     this.context.Entry(scheduledQuestionnaire.ResponseGroup).State         = EntityState.Unchanged;
     this.context.Entry(scheduledQuestionnaire.AssignedQuestionnaire).State = EntityState.Unchanged;
     this.context.SaveChanges();
 }
Beispiel #2
0
        /// <summary>
        /// Schedules a questionnaire date for a AssignedQuestionnaire
        /// </summary>
        /// <param name="questionnaireName">The name of the questionnaire to schedule</param>
        /// <param name="aq">the AssignedQuestionnaire class it will belong to</param>
        /// <param name="calculatedDate">The date and time that has been calculated</param>
        /// <param name="scheduleString"> The schedule string that resulted in this date and time</param>
        /// <returns>The schedule questionnaire date instance</returns>
        public ScheduledQuestionnaireDate ScheduleDateForQuestionnaire(string questionnaireName, AssignedQuestionnaire aq, DateTime calculatedDate, string scheduleString)
        {
            ScheduledQuestionnaireDate sqd = new ScheduledQuestionnaireDate();

            sqd.AssignedQuestionnaire   = this.context.AssignedQuestionnaires.Where(a => a.Id == aq.Id).Single();
            sqd.ScheduleHasBeenExecuted = false;
            sqd.CalculatedDate          = calculatedDate;
            sqd.ScheduleString          = scheduleString;
            this.context.ScheduledQuestionnaireDates.Add(sqd);
            this.context.SaveChanges();

            return(sqd);
        }
Beispiel #3
0
        /// <summary>
        /// Scheduler for demo purposes. An Assigned Questionnaire is scheduled when there are no non-completed QuestionnaireUserResponseGroups
        /// </summary>
        public static void ScheduleQuestionnairesForDemo()
        {
            AccessHandlerManager         ahm            = new AccessHandlerManager();
            List <AssignedQuestionnaire> questionnaires = ahm.EpisodeAccessHandler.GetAssignedQuestionnaires();

            foreach (AssignedQuestionnaire aq in questionnaires)
            {
                if (aq.Schedules.Where(s => s.ResponseGroup != null && !s.ResponseGroup.Completed).Count() == 0)
                {
                    ScheduledQuestionnaireDate sqd = ahm.EpisodeAccessHandler.ScheduleDateForQuestionnaire(aq.QuestionnaireName, aq, DateTime.Now, aq.ScheduleString);
                    ahm.QuestionnaireAccessHandler.CreateQuestionnaireUserResponseGroup(aq.Episode.Patient.Id, aq.QuestionnaireName, null, sqd);
                }
            }
        }
        /// <summary>
        /// Creates a User Response Group for the given user and Questionnaire Name
        /// </summary>
        /// <param name="patientId">The id of the Patient</param>
        /// <param name="questionnaireName">The name of the questionnaire</param>
        /// <param name="formatName">the name of the format to create the response group for. If null the default format name of the questionnaire is used</param>
        /// <param name="sqd">The optional scheduled questionniare date that the user responsegroup must belong to</param>
        /// <returns>The newly created QuestionnaireUserResponseGroup</returns>
        public QuestionnaireUserResponseGroup CreateQuestionnaireUserResponseGroup(string patientId, string questionnaireName, string formatName, ScheduledQuestionnaireDate sqd)
        {
            QuestionnaireUserResponseGroup group = new QuestionnaireUserResponseGroup();

            group.Patient                 = this.context.Patients.Where(u => u.Id == patientId).Single();
            group.Questionnaire           = this.context.Questionnaires.Where(q => q.Name == questionnaireName).OrderByDescending(q => q.Id).First();
            group.QuestionnaireFormatName = formatName == null ? group.Questionnaire.DefaultFormatName : formatName;
            group.DatetimeCreated         = DateTime.Now;
            group.Status = QuestionnaireUserResponseGroupStatus.New;
            group.ScheduledQuestionnaireDate = sqd == null ? null : this.context.ScheduledQuestionnaireDates.Where(s => s.Id == sqd.Id).Single();
            this.context.QuestionnaireUserResponseGroups.Add(group);
            this.context.SaveChanges();
            new NotificationHandler(this.context).CreateNotification(NotificationType.NewQuestionnaire, group.Id);

            return(group);
        }
Beispiel #5
0
        /// <summary>
        /// Runs through the schedules available and checks which Questionnairs must be assigned.
        /// </summary>
        public static void ScheduleQuestionnaires()
        {
            AccessHandlerManager         ahm            = new AccessHandlerManager();
            List <AssignedQuestionnaire> questionnaires = ahm.EpisodeAccessHandler.GetAssignedQuestionnaires();

            foreach (AssignedQuestionnaire aq in questionnaires)
            {
                var milestones     = aq.Episode.MileStones.GroupBy(m => m.Milestone.Name.ToLower()).ToDictionary(k => k.Key, v => (IEnumerable <DateTime>)v.Select(m => m.MilestoneDate).ToList());
                var scheduledDates = new ScheduleParser().ParseSchedule(aq.ScheduleString, aq.Episode.DateCreated, milestones);

                /*
                 * foreach (var scheduled in aq.Schedules)
                 * {
                 *  if (scheduled.ResponseGroup != null && scheduled.ResponseGroup.Status == QuestionnaireUserResponseGroupStatus.New && (!scheduledDates.ContainsKey(scheduled.ScheduleString) || !scheduledDates[scheduled.ScheduleString].Contains(scheduled.CalculatedDate.Value)))
                 *  {
                 *      // TODO should we remove?
                 *  }
                 * }*/

                // Find which dates we have to schedule
                List <ToSchedule> toSchedule = new List <ToSchedule>();
                var schedules = aq.Schedules.GroupBy(s => s.ScheduleString).ToDictionary(k => k.Key, v => v.Select(s => s.CalculatedDate).ToList());
                foreach (var dates in scheduledDates)
                {
                    if (!schedules.ContainsKey(dates.Key))
                    {
                        foreach (DateTime date in dates.Value)
                        {
                            toSchedule.Add(new ToSchedule()
                            {
                                ScheduleString = dates.Key, DateTimeToSchedule = date
                            });
                        }
                    }
                    else
                    {
                        foreach (DateTime date in dates.Value)
                        {
                            if (!schedules[dates.Key].Contains(date))
                            {
                                toSchedule.Add(new ToSchedule()
                                {
                                    ScheduleString = dates.Key, DateTimeToSchedule = date
                                });
                            }
                        }
                    }
                }

                // Create the new ScheduledQuestionnaireDate instances
                List <ScheduledQuestionnaireDate> newSchedules = new List <ScheduledQuestionnaireDate>();
                foreach (ToSchedule ts in toSchedule)
                {
                    ScheduledQuestionnaireDate sqd = ahm.EpisodeAccessHandler.ScheduleDateForQuestionnaire(aq.QuestionnaireName, aq, ts.DateTimeToSchedule, ts.ScheduleString);
                    newSchedules.Add(sqd);
                }

                newSchedules.AddRange(aq.Schedules.Where(s => s.ScheduleHasBeenExecuted = false));

                if (newSchedules.Count > 0)
                {
                    newSchedules.OrderBy(s => s.CalculatedDate);

                    // Schedule the last one that is not schedule and after this date
                    DateTime today     = DateTime.Now;
                    var      lastEntry = newSchedules.Where(s => s.CalculatedDate < today).OrderBy(s => s.CalculatedDate).LastOrDefault();
                    if (lastEntry != null)
                    {
                        ahm.QuestionnaireAccessHandler.CreateQuestionnaireUserResponseGroup(aq.Episode.Patient.Id, aq.QuestionnaireName, null, lastEntry);
                        lastEntry.ScheduleHasBeenExecuted = true;
                        ahm.EpisodeAccessHandler.UpdateScheduleQuestionnaireDate(lastEntry);
                    }

                    // Mark all the other ones as not completed
                    var toDisable = newSchedules.Where(s => s.CalculatedDate < (lastEntry != null ? lastEntry.CalculatedDate : today));
                    foreach (var sqd in toDisable)
                    {
                        sqd.ScheduleHasBeenExecuted = true;
                        ahm.EpisodeAccessHandler.UpdateScheduleQuestionnaireDate(sqd);
                        if (sqd.ResponseGroup != null)
                        {
                            ahm.QuestionnaireAccessHandler.SaveQuestionnaireResponse(sqd.ResponseGroup.Questionnaire.Id, sqd.ResponseGroup.Id, true, new List <QuestionnaireResponse>(), QuestionnaireUserResponseGroupStatus.Missed);
                        }
                    }
                }
            }
        }