private bool Validate(ConditionsModel m, out IList <string> errorMessages)
        {
            errorMessages = new List <string>();
            if (string.IsNullOrEmpty(m.Report) && m.RequestType != null)
            {
                errorMessages.Add("At least one item must be selected in Report Selector.");
            }
            if (string.IsNullOrEmpty(m.Race))
            {
                errorMessages.Add("At least one item must be selected in Race Selector.");
            }
            if (m.StartPeriodDate > m.EndPeriodDate)
            {
                errorMessages.Add("Start Period date cannot be greater than End Period date.");
            }
            if (m.MaxAge > 150)
            {
                errorMessages.Add("Age cannot be greater 150.");
            }
            if (m.MinAge > m.MaxAge)
            {
                errorMessages.Add("Minimum age cannot be greater than maximum age.");
            }
            if (string.IsNullOrEmpty(m.Codes) && string.IsNullOrEmpty(m.Disease))
            {
                errorMessages.Add("At least one ICD-9 code must be selected.");
            }

            return(errorMessages.Count > 0 ? false : true);
        }
        private DateTime?GetObservationEndPeriod(ConditionsModel m)
        {
            DateTime?endPeriod    = null;
            bool     useEndPeriod = false;

            foreach (var criteriaGroup in m.CriteriaGroups)
            {
                if (criteriaGroup.ExcludeCriteriaGroup == false)
                {
                    foreach (var term in criteriaGroup.Terms)
                    {
                        if (term.TermName == "ObservationPeriod")
                        {
                            foreach (var arg in term.Args)
                            {
                                if (arg.Key == "UseEndPeriod" && arg.Value == "true")
                                {
                                    useEndPeriod = true;;
                                }
                                else if (arg.Key == "EndPeriod" && !arg.Value.NullOrEmpty())
                                {
                                    endPeriod = DateTime.Parse(arg.Value);
                                }
                            }
                        }
                    }
                }
            }
            return(useEndPeriod == true ? endPeriod : null);
        }
        private byte[] BuildComposerRequest(IDnsRequestContext request, ConditionsModel m)
        {
            request_builder requestBuilder = LoadReportHeader(request);

            requestBuilder.request.criteria = new criteria();

            IList <variablesType> IncludeList = new List <variablesType>();
            IList <variablesType> ExcludeList = new List <variablesType>();

            foreach (var criteriaGroup in m.CriteriaGroups)
            {
                if (criteriaGroup.ExcludeCriteriaGroup == true)
                {
                    ExcludeList.Add(BuildTerms(criteriaGroup));
                }
                else
                {
                    IncludeList.Add(BuildTerms(criteriaGroup));
                }
            }

            if (IncludeList.Count > 0)
            {
                requestBuilder.request.criteria.inclusion_criteria = IncludeList.ToArray();
            }

            if (ExcludeList.Count > 0)
            {
                requestBuilder.request.criteria.exclusion_criteria = ExcludeList.ToArray();
            }

            LoadReportSelector(m, requestBuilder);

            return(SerializeRequest(requestBuilder));
        }
        public ActionResult SaveConditions(ConditionsModel selectedCondition)
        {
            using (var db = new VisualTraining.Models.Database.VisualTrainingModel())
            {
                var conditionLines = db.ConditionLines.Where(x => x.DiagnosisID == selectedCondition.DiagnosisId).ToList();
                //foreach(var conditionId in selectedCondition.SelectedConditions)
                //{

                //}

                return(Json(new { success = true }, JsonRequestBehavior.AllowGet));
            }
        }
        /// <summary>
        /// Initializes the model for editing, relying on static lists
        /// </summary>
        /// <param name="m"></param>
        /// <returns></returns>
        private static ConditionsModel InitializeModel(ConditionsModel m, IDnsRequestContext request)
        {
            var periodStratification = PeriodStratificationSelectionList.periods.Select(period => new StratificationCategoryLookUp {
                CategoryText = period.Name, StratificationCategoryId = period.Code
            });
            var ageStratification = AgeStratificationSelectionList.ages.Select(age => new StratificationCategoryLookUp {
                CategoryText = age.Display, StratificationCategoryId = age.Code
            });

            m.DiseaseSelections = DiseaseSelectionList.diseases.Select(disease => new ConditionsSelection {
                Name = disease.Name, Display = disease.Display, Value = disease.Code
            });
            m.RaceSelections = RaceSelectionList.races.Select(race => new StratificationCategoryLookUp {
                CategoryText = race.Name, StratificationCategoryId = race.Code
            });
            m.EthnicitySelections = RaceSelectionList.ethnicities.Select(ethnicity => new StratificationCategoryLookUp {
                CategoryText = ethnicity.Name, StratificationCategoryId = ethnicity.Code
            });
            // this is only set by our GetModel, not the generic one, so ensure it is set here
            m.RequestType   = ConditionsRequestType.All.FirstOrDefault(rt => rt.ID == request.RequestType.ID);
            m.SexSelections = SexSelectionList.sexes.Select(sex => new StratificationCategoryLookUp {
                CategoryText = sex.Name, StratificationCategoryId = sex.Code
            });
            m.ZipCodeSelections = ZipCodeSelectionList.zipCodes.Select(zip => new StratificationCategoryLookUp {
                CategoryText = zip.ZipCode, ClassificationText = zip.Name, StratificationCategoryId = zip.Code
            });

            m.ReportSelections = new[] {
                new ReportSelection {
                    Name = "PeriodStratification", Display = "Period", Value = (int)ReportSelectionCode.Period, SelectionList = periodStratification
                },
                new ReportSelection {
                    Name = "AgeStratification", Display = "Age", Value = (int)ReportSelectionCode.Age, SelectionList = ageStratification
                },
                new ReportSelection {
                    Name = "SexStratification", Display = "Sex", Value = (int)ReportSelectionCode.Sex
                },
                new ReportSelection {
                    Name = "RaceStratification", Display = "Race", Value = (int)ReportSelectionCode.Race
                },
                new ReportSelection {
                    Name = "CenterStratification", Display = "Center", Value = (int)ReportSelectionCode.Center
                },
                new ReportSelection {
                    Name = "ZipStratification", Display = "Zip", Value = (int)ReportSelectionCode.Zip
                },
            };

            return(m);
        }
        private byte[] BuildUIArgs(ConditionsModel m)
        {
            byte[] modelBytes;

            XmlSerializer serializer = new XmlSerializer(typeof(ConditionsModel));

            using (StringWriter sw = new StringWriter())
            {
                ConditionsModel serializedModel = new ConditionsModel
                {
                    Codes                = m.Codes,
                    AgeStratification    = m.AgeStratification,
                    Disease              = m.Disease,
                    EndPeriodDate        = m.EndPeriodDate,
                    MaxAge               = m.MaxAge,
                    MinAge               = m.MinAge,
                    MinVisits            = m.MinVisits,
                    PeriodStratification = m.PeriodStratification,
                    Race               = m.Race,
                    Ethnicity          = m.Ethnicity,
                    RaceStratification = m.RaceStratification,
                    Report             = m.Report,
                    Sex                = m.Sex,
                    StartPeriodDate    = m.StartPeriodDate,
                    ICD9Stratification = m.ICD9Stratification,
                    CriteriaGroupsJSON = m.CriteriaGroupsJSON,
                    TobaccoUse         = m.TobaccoUse
                };

                using (XmlWriter xmlWriter = XmlWriter.Create(sw, new XmlWriterSettings {
                    OmitXmlDeclaration = true
                }))
                {
                    xmlWriter.WriteProcessingInstruction("xml-stylesheet", "type=\"text/xsl\" href=\"#stylesheet\"");
                    xmlWriter.WriteDocType("ConditionsModel", null, null, "<!ATTLIST xsl:stylesheet id ID #REQUIRED>");

                    using (StreamReader transform = new StreamReader(this.GetType().Assembly.GetManifestResourceStream("Lpp.Dns.HealthCare.Conditions.Code.ConditionToHTML.xsl")))
                    {
                        string xsl = transform.ReadToEnd();
                        serializer.Serialize(xmlWriter, serializedModel, null);
                        string xml = sw.ToString();
                        xml        = xml.Substring(0, xml.IndexOf("<AgeStratification")) + xsl + xml.Substring(xml.IndexOf("<AgeStratification"));
                        modelBytes = Encoding.UTF8.GetBytes(xml);
                    }
                }
            }

            return(modelBytes);
        }
        public DnsResult ValidateForSubmission(IDnsRequestContext context)
        {
            // this model does not need the editing/lookup support (using InitializeModel)
            ConditionsModel m = GetModel(context);
            IList <string>  errorMessages;

            if (!Validate(m, out errorMessages))
            {
                return(DnsResult.Failed(errorMessages.ToArray <string>()));
            }
            else
            {
                return(DnsResult.Success);
            }
        }
        private ConditionsModel GetModel(IDnsRequestContext context)
        {
            var m = new ConditionsModel
            {
                StartPeriodDate = DateTime.Now,
                EndPeriodDate   = DateTime.Now,
                RequestType     = ConditionsRequestType.All.FirstOrDefault(rt => rt.ID == context.RequestType.ID)
            };

            if (context.Documents != null && context.Documents.Count() > 0)
            {
                var doc = (from aDoc in context.Documents
                           where aDoc.Name == REQUEST_ARGS_FILENAME
                           select aDoc).FirstOrDefault();

                XmlSerializer serializer = new XmlSerializer(typeof(ConditionsModel));
                using (var db = new DataContext())
                {
                    using (var docStream = new DocumentStream(db, doc.ID))
                    {
                        using (XmlTextReader reader = new XmlTextReader(docStream))
                        {
                            ConditionsModel deserializedModel = (ConditionsModel)serializer.Deserialize(reader);
                            m.AgeStratification    = deserializedModel.AgeStratification;
                            m.Codes                = deserializedModel.Codes;
                            m.Disease              = deserializedModel.Disease;
                            m.EndPeriodDate        = deserializedModel.EndPeriodDate;
                            m.ICD9Stratification   = deserializedModel.ICD9Stratification;
                            m.MaxAge               = deserializedModel.MaxAge;
                            m.MinAge               = deserializedModel.MinAge;
                            m.MinVisits            = deserializedModel.MinVisits;
                            m.PeriodStratification = deserializedModel.PeriodStratification;
                            m.Race            = deserializedModel.Race;
                            m.Ethnicity       = deserializedModel.Ethnicity;
                            m.Report          = deserializedModel.Report;
                            m.Sex             = deserializedModel.Sex;
                            m.TobaccoUse      = deserializedModel.TobaccoUse;
                            m.StartPeriodDate = deserializedModel.StartPeriodDate;
                        }
                    }
                }
            }

            return(m);
        }
        // So, in order to make sure that the model looks like the one handed out in the original EditRequestView,
        // we need to split the initialization logic into three pieces... a "GetModel", an instanced InitializeModel,
        // and finally static InitializeModel.

        /// <summary>
        /// Initializes the model for editing, relying on lists that are loaded into this instance
        /// </summary>
        /// <param name="m"></param>
        /// <returns></returns>
        private ConditionsModel InitializeModel(ConditionsModel m)
        {
            // initialize the lists that need instance data... the rest are set up in the static InitializeModel
            using (var db = new DataContext())
            {
                var categories = db.LookupListCategories.Where(c => c.ListId == Lists.SPANDiagnosis || c.ListId == Lists.ZipCodes).ToArray();

                var values = db.LookupListValues.Where(v => v.ListId == Lists.SPANDiagnosis || v.ListId == Lists.ZipCodes).ToArray();

                m.ICD9Categories = categories.Where(c => c.ListId == Lists.SPANDiagnosis); //lookuplist category
                m.ICD9Values     = values.Where(v => v.ListId == Lists.SPANDiagnosis);     //lookuplist value
                m.ZipCategories  = categories.Where(c => c.ListId == Lists.ZipCodes);
                m.ZipValues      = values.Where(v => v.ListId == Lists.ZipCodes);
            }
            //m.Asthma = IcdCodes.All.Where(v => v.ListId == Lists.
            //To-do Jamie
            return(m);
        }
        private TermModel GetTerm(ConditionsModel m, string name)
        {
            TermModel t = null;

            foreach (var criteriaGroup in m.CriteriaGroups)
            {
                if (criteriaGroup.ExcludeCriteriaGroup == false)
                {
                    foreach (var term in criteriaGroup.Terms)
                    {
                        if (term.TermName == name)
                        {
                            t = term;
                        }
                    }
                }
            }
            return(t);
        }
        /// <summary>
        /// Helper function to load up the report selector
        /// </summary>
        /// <param name="m"></param>
        /// <param name="requestBuilder"></param>
        private void LoadReportSelector(ConditionsModel m, request_builder requestBuilder)
        {
            string[] reportSelections = m.Report.Split(',');

            if (reportSelections.Length > 0 && !string.IsNullOrEmpty(reportSelections[0]))
            {
                requestBuilder.response                = new response();
                requestBuilder.response.report         = new report();
                requestBuilder.response.report.name    = "Default";
                requestBuilder.response.report.options = new option[reportSelections.Length];
                int i = 0;
                ReportSelectionCode repSel;

                foreach (string reportSelection in reportSelections)
                {
                    requestBuilder.response.report.options[i] = new option();

                    if (Enum.TryParse <ReportSelectionCode>(reportSelection, out repSel))
                    {
                        switch (repSel)
                        {
                        case ReportSelectionCode.Age:
                            requestBuilder.response.report.options[i].name  = "Age";
                            requestBuilder.response.report.options[i].value = m.AgeStratification.ToString();
                            break;

                        case ReportSelectionCode.Sex:
                            requestBuilder.response.report.options[i].name = "Sex";
                            break;

                        case ReportSelectionCode.Period:
                            requestBuilder.response.report.options[i].name  = "Observation_Period";
                            requestBuilder.response.report.options[i].value = m.PeriodStratification.ToString();
                            break;

                        case ReportSelectionCode.Race:
                            requestBuilder.response.report.options[i].name = "Race";
                            break;

                        case ReportSelectionCode.Ethnicity:
                            requestBuilder.response.report.options[i].name = "Ethnicity";
                            break;

                        case ReportSelectionCode.Center:
                            requestBuilder.response.report.options[i].name = "CenterId";
                            break;

                        case ReportSelectionCode.ICD9:
                            requestBuilder.response.report.options[i].name  = "ICD9";
                            requestBuilder.response.report.options[i].value = m.ICD9Stratification.ToString();
                            break;

                        case ReportSelectionCode.Disease:
                            requestBuilder.response.report.options[i].name = "Disease";
                            break;

                        case ReportSelectionCode.Zip:
                            requestBuilder.response.report.options[i].name = "Zip";
                            break;

                        case ReportSelectionCode.TobaccoUse:
                            requestBuilder.response.report.options[i].name = "TobaccoUse";
                            break;
                        }
                    }

                    i++;
                }
            }
        }
        private byte[] BuildRequest(IDnsRequestContext request, ConditionsModel m)
        {
            request_builder requestBuilder = LoadReportHeader(request);

            requestBuilder.request.variables                     = new variablesType();
            requestBuilder.request.variables.operation           = new operation();
            requestBuilder.request.variables.operation.@operator = "And";

            IList <variable> variables = new List <variable>();

            // Observation Period Range
            DateTime sasZeroDate    = DateTime.Parse("1960-01-01");
            var      sasStartPeriod = m.StartPeriodDate == null ? 0 : (m.StartPeriodDate.Value.Subtract(sasZeroDate)).Days;
            var      sasEndPeriod   = m.EndPeriodDate == null ? 0 : (m.EndPeriodDate.Value.Subtract(sasZeroDate)).Days;

            variables.Add(new variable {
                name = "Observation_Period", value = sasStartPeriod.ToString(), @operator = ">="
            });
            variables.Add(new variable {
                name = "Observation_Period", value = sasEndPeriod.ToString(), @operator = "<="
            });

            IList <operation> operations = new List <operation>();

            variables.Add(new variable {
                name = "Disease", value = m.Disease.ToString()
            });

            // Age Range
            variables.Add(new variable {
                name = "Age", value = m.MaxAge.ToString(), @operator = "<="
            });
            variables.Add(new variable {
                name = "Age", value = m.MinAge.ToString(), @operator = ">="
            });

            // Sex Selector
            if (m.Sex == SexSelectionList.Male.Code || m.Sex == SexSelectionList.Female.Code)
            {
                variables.Add(new variable {
                    name = "Sex", value = SexSelectionList.GetName(m.Sex).Substring(0, 1)
                });
            }
            else
            {
                operation sexOperation = new operation();
                operations.Add(sexOperation);
                sexOperation.@operator = "Or";
                IList <variable> sexVariables = new List <variable>();
                sexVariables.Add(new variable {
                    name = "Sex", value = SexSelectionList.Male.Name.Substring(0, 1)
                });
                sexVariables.Add(new variable {
                    name = "Sex", value = SexSelectionList.Female.Name.Substring(0, 1)
                });
                sexOperation.variable = sexVariables.ToArray <variable>();
            }

            // Race Selector
            string[] races = m.Race.Split(',');
            if (races.Length > 0 && !string.IsNullOrEmpty(races[0]))
            {
                operation raceOperation = new operation();
                operations.Add(raceOperation);
                raceOperation.@operator = "Or";
                IList <variable> raceVariables = new List <variable>();
                foreach (string race in races)
                {
                    if (race.NullOrEmpty())
                    {
                        continue;
                    }
                    raceVariables.Add(new variable {
                        name = "Race", value = RaceConvert(race)
                    });
                }
                raceOperation.variable = raceVariables.ToArray <variable>();
            }

            if (variables.Count > 0)
            {
                requestBuilder.request.variables.operation.variable = variables.ToArray <variable>();
            }

            if (operations.Count > 0)
            {
                requestBuilder.request.variables.operation.operation1 = operations.ToArray <operation>();
            }

            LoadReportSelector(m, requestBuilder);

            return(SerializeRequest(requestBuilder));
        }