public static PregnancyChecklistItemsResult GetSortedPregnancyChecklist(IDashboardRepository repo, string patientDfn, PregnancyDetails pregnancy, DsioChecklistCompletionStatus status)
        {
            PregnancyChecklistItemsResult result = new PregnancyChecklistItemsResult();

            PregnancyChecklistItemsResult chkResult = repo.Checklist.GetPregnancyItems(patientDfn, pregnancy.Ien, "", status);

            result.SetResult(chkResult.Success, chkResult.Message);

            if (result.Success)
            {
                PregnancyChecklistItemList tempList = new PregnancyChecklistItemList();

                tempList.AddRange(chkResult.Items);

                tempList.AddPregnancyDates(pregnancy.EDD, pregnancy.EndDate);

                tempList.Sort(delegate(PregnancyChecklistItem x, PregnancyChecklistItem y)
                {
                    return(x.DueDate.CompareTo(y.DueDate));
                });

                result.Items = tempList;
            }

            return(result);
        }
        public ActionResult PregnancyIndex(string dfn, string pregIen, string page)
        {
            PregnancyChecklistIndex model = new PregnancyChecklistIndex();

            model.Patient = this.CurrentPatient;

            // TODO: In future add ability to view checklist for a specific pregnancy passed in as parameter
            //       Add a pregnancy selection and display
            //PregnancyDetails preg = PregnancyUtilities.GetWorkingPregnancy(this.DashboardRepository, dfn, pregIen);

            PregnancyDetails preg = PregnancyUtilities.GetWorkingPregnancy(this.DashboardRepository, dfn, "");

            if (preg == null)
            {
                model.NoPregnancies = true;
            }
            else
            {
                if ((preg.EDD == DateTime.MinValue) && (preg.EndDate == DateTime.MinValue))
                {
                    model.NoPregnancyDate = true;
                }

                model.Pregnancy = preg;

                //PregnancyChecklistItemsResult result = this.DashboardRepository.Checklist.GetPregnancyItems(dfn, preg.Ien, "");

                //if (!result.Success)
                //    this.Error(result.Message);
                //else
                //{
                //    model.Items = new PregnancyChecklistItemList();
                //    model.Items.AddRange(result.Items);

                //    model.Items.AddPregnancyDates(preg.EDD, preg.EndDate);

                //    model.Items.Sort(delegate(PregnancyChecklistItem x, PregnancyChecklistItem y)
                //    {
                //        return x.DueDate.CompareTo(y.DueDate);
                //    });
                //}

                PregnancyChecklistItemsResult result = ChecklistUtility.GetSortedPregnancyChecklist(this.DashboardRepository, dfn, preg, DsioChecklistCompletionStatus.Unknown);

                if (!result.Success)
                {
                    this.Error(result.Message);
                }
                else
                {
                    model.Items.AddRange(result.Items);
                }
            }

            // TODO: Paging...

            return(View(model));
        }
        public static BrokerOperationResult UpdateNextDates(IDashboardRepository repo, string patientDfn, string pregnancyIen)
        {
            BrokerOperationResult result = new BrokerOperationResult();

            // *** First get the pregnancy ***
            PregnancyListResult pregResult = repo.Pregnancy.GetPregnancies(patientDfn, pregnancyIen);

            result.SetResult(pregResult.Success, pregResult.Message);

            if (pregResult.Success)
            {
                if (pregResult.Pregnancies != null)
                {
                    if (pregResult.Pregnancies.Count > 0)
                    {
                        // *** Get the checklist items ***

                        PregnancyChecklistItemsResult getResult = GetSortedPregnancyChecklist(repo, patientDfn, pregResult.Pregnancies[0], DsioChecklistCompletionStatus.NotComplete);

                        result.SetResult(getResult.Success, getResult.Message);

                        if (result.Success)
                        {
                            if (getResult.Items != null)
                            {
                                if (getResult.Items.Count > 0)
                                {
                                    // *** Find the next due ***
                                    DateTime nextChecklistDue = getResult.Items[0].DueDate;

                                    // *** Save next checklist observation ***
                                    result = repo.Observations.UpdateNextChecklistDue(patientDfn, nextChecklistDue);

                                    if (result.Success)
                                    {
                                        // *** Find next contact due ***
                                        DateTime nextContactDue = DateTime.MinValue;

                                        foreach (PregnancyChecklistItem item in getResult.Items)
                                        {
                                            if (item.ItemType == DsioChecklistItemType.MccCall)
                                            {
                                                nextContactDue = item.DueDate;
                                                break;
                                            }
                                        }

                                        result = repo.Observations.UpdateNextContactDue(patientDfn, nextContactDue);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return(result);
        }
        public static BrokerOperationResult CompleteEducationItem(IDashboardRepository repo, string patientDfn, string educationItemIen, string checklistItemIen)
        {
            BrokerOperationResult returnResult = new BrokerOperationResult();

            // *** Two-step process:
            // ***      (1) Create completed patient education item
            // ***      (2) Complete the checklist item

            PatientEducationItem patItem = new PatientEducationItem()
            {
                PatientDfn       = patientDfn,
                EducationItemIen = educationItemIen,
                CompletedOn      = DateTime.Now
            };

            IenResult saveResult = repo.Education.SavePatientItem(patItem);

            returnResult.SetResult(saveResult.Success, saveResult.Message);

            if (saveResult.Success)
            {
                PregnancyChecklistItemsResult result = repo.Checklist.GetPregnancyItems(patientDfn, "", checklistItemIen);

                returnResult.SetResult(result.Success, result.Message);

                if (result.Success)
                {
                    if (result.Items != null)
                    {
                        if (result.Items.Count > 0)
                        {
                            PregnancyChecklistItem checkItem = result.Items[0];

                            checkItem.CompletionStatus = DsioChecklistCompletionStatus.Complete;
                            checkItem.CompletionLink   = saveResult.Ien;

                            IenResult ienResult = repo.Checklist.SavePregnancyItem(checkItem);

                            returnResult.SetResult(ienResult.Success, ienResult.Message);

                            if (returnResult.Success)
                            {
                                returnResult = UpdateNextDates(repo, patientDfn, checkItem.PregnancyIen);

                                if (returnResult.Success)
                                {
                                    returnResult.Message = "Education item completed";
                                }
                            }
                        }
                    }
                }
            }

            return(returnResult);
        }
        //[HttpGet]
        //public ActionResult Timeline(string patientId)
        //{
        //    TrackedPatient model = this.DashboardRepository.Patients.Get("1234");

        //    return View(model);

        //}

        private void UpdateChecklistSummary(PatientSummary model, string dfn, PregnancyResult pregResult)
        {
            const int itemCount = 4;

            PregnancyChecklistItemsResult checklistResult = this.DashboardRepository.Checklist.GetPregnancyItems(dfn, pregResult.Pregnancy.Ien, "", DsioChecklistCompletionStatus.NotComplete);

            if (checklistResult.Success)
            {
                if (checklistResult.Items != null)
                {
                    PregnancyChecklistItemList tempList = new PregnancyChecklistItemList();

                    tempList.AddRange(checklistResult.Items);

                    tempList.AddPregnancyDates(pregResult.Pregnancy.EDD, pregResult.Pregnancy.EndDate);

                    tempList.Sort(delegate(PregnancyChecklistItem x, PregnancyChecklistItem y)
                    {
                        return(x.DueDate.CompareTo(y.DueDate));
                    });

                    int tempCount = 0;
                    foreach (PregnancyChecklistItem tempItem in tempList)
                    {
                        if (model.PregnancyChecklistItems == null)
                        {
                            model.PregnancyChecklistItems = new PregnancyChecklistItemList();
                        }

                        model.PregnancyChecklistItems.Add(tempItem);

                        tempCount += 1;

                        if (tempCount == itemCount)
                        {
                            break;
                        }
                    }

                    if (tempList.Count > itemCount)
                    {
                        model.MoreChecklistItems = string.Format("{0} more", tempList.Count - itemCount);
                    }

                    model.ChecklistLink = Url.Action("PregnancyIndex", "Checklist", new { dfn = model.Patient.Dfn, pregIen = pregResult.Pregnancy.Ien, page = "1" });
                }
            }
        }
        public ActionResult PregnancyAddEdit(string dfn, string pregIen, string itemIen)
        {
            PregnancyChecklistAddEdit model = new PregnancyChecklistAddEdit();

            model.Patient = this.CurrentPatient;

            if (!string.IsNullOrWhiteSpace(itemIen))
            {
                PregnancyChecklistItemsResult result = this.DashboardRepository.Checklist.GetPregnancyItems(dfn, "", itemIen);

                if (!result.Success)
                {
                    this.Error(result.Message);
                }
                else
                {
                    if (result.Items != null)
                    {
                        if (result.Items.Count > 0)
                        {
                            model.Item = result.Items[0];

                            model.GetDueVals();

                            //if (model.Item.ItemType == DsioChecklistItemType.EducationItem)
                            //    model.EducationItemLink = model.Item.Link;
                        }
                    }
                }
            }
            else
            {
                model.Item.PatientDfn       = dfn;
                model.Item.PregnancyIen     = pregIen;
                model.Item.CompletionStatus = DsioChecklistCompletionStatus.NotComplete;
            }

            model.EducationItemSelection = this.DashboardRepository.Education.GetItemSelection();

            return(View(model));
        }
        private void GetMergedList(PatientEducationIndex model, PregnancyDetails preg)
        {
            PregnancyChecklistItemsResult result = this.DashboardRepository.Checklist.GetPregnancyItems(model.Patient.Dfn, preg.Ien, "");

            if (!result.Success)
            {
                this.Error(result.Message);
            }
            else
            {
                // *** Create view items ***

                if (result.Items != null)
                {
                    foreach (PregnancyChecklistItem item in result.Items)
                    {
                        if (item.ItemType == DsioChecklistItemType.EducationItem)
                        {
                            PatientEducationChecklistItem newItem = new PatientEducationChecklistItem();
                            newItem.PregnancyChecklistItem = item;
                            model.ItemList.Add(newItem);
                        }
                    }
                }

                // *** Get patient education items ***

                PatientEducationItemsResult edResult = this.DashboardRepository.Education.GetPatientItems(
                    model.Patient.Dfn,
                    "",
                    DateTime.MinValue,
                    DateTime.MinValue,
                    EducationItemType.Unknown,
                    1,
                    1000
                    );

                if (!edResult.Success)
                {
                    this.Error(edResult.Message);
                }
                else
                {
                    Dictionary <string, PatientEducationItem> patEdItems = new Dictionary <string, PatientEducationItem>();

                    // *** Place patient education items in dictionary for lookup ***

                    if (edResult.Items != null)
                    {
                        foreach (PatientEducationItem patEdItem in edResult.Items)
                        {
                            patEdItems.Add(patEdItem.Ien, patEdItem);
                        }
                    }

                    // *** Go through checklist to find links to patient education ***

                    foreach (PatientEducationChecklistItem finalItem in model.ItemList)
                    {
                        if (finalItem.PregnancyChecklistItem != null)
                        {
                            if (finalItem.PregnancyChecklistItem.CompletionStatus == DsioChecklistCompletionStatus.Complete)
                            {
                                if (!string.IsNullOrWhiteSpace(finalItem.PregnancyChecklistItem.CompletionLink))
                                {
                                    if (patEdItems.ContainsKey(finalItem.PregnancyChecklistItem.CompletionLink))
                                    {
                                        // *** If found add to final ***
                                        finalItem.PatientEducationItem = patEdItems[finalItem.PregnancyChecklistItem.CompletionLink];

                                        // *** Remove since already added ***
                                        patEdItems.Remove(finalItem.PregnancyChecklistItem.CompletionLink);
                                    }
                                }
                            }
                        }
                    }

                    // *** Now that we've added all items that are linked, add remainder ***
                    foreach (PatientEducationItem patEdItem in patEdItems.Values)
                    {
                        PatientEducationChecklistItem newItem = new PatientEducationChecklistItem();
                        newItem.PatientEducationItem = patEdItem;
                        model.ItemList.Add(newItem);
                    }

                    // *** Finally get education items linked by a checklist but incomplete ***
                    foreach (PatientEducationChecklistItem finalItem in model.ItemList)
                    {
                        if (finalItem.PregnancyChecklistItem != null)
                        {
                            if (finalItem.PregnancyChecklistItem.CompletionStatus != DsioChecklistCompletionStatus.Complete)
                            {
                                if (!string.IsNullOrWhiteSpace(finalItem.Link))
                                {
                                    EducationItemsResult edItemsResult = this.DashboardRepository.Education.GetEducationItems(finalItem.Link, "", EducationItemType.Unknown, 0, 0, EducationItemSort.Type);

                                    if (edItemsResult.Success)
                                    {
                                        if (edItemsResult.EducationItems != null)
                                        {
                                            if (edItemsResult.EducationItems.Count > 0)
                                            {
                                                finalItem.EducationItem = edItemsResult.EducationItems[0];
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                model.ItemList.AddPregnancyDates(preg.EDD, preg.EndDate);

                model.ItemList.Sort(delegate(PatientEducationChecklistItem x, PatientEducationChecklistItem y)
                {
                    return(x.CompareDate.CompareTo(y.CompareDate));
                });
            }
        }