Esempio n. 1
0
        /// <summary>
        /// Constructs a response containing the applicable questions with their answers.
        /// </summary>
        /// <returns></returns>
        private QuestionResponse BuildResponse()
        {
            List <QuestionGroup> groupList = new List <QuestionGroup>();
            QuestionGroup        qg        = new QuestionGroup();
            QuestionSubCategory  sc        = new QuestionSubCategory();
            QuestionAnswer       qa        = new QuestionAnswer();

            int curGroupId   = 0;
            int curPairingId = 0;


            int displayNumber = 0;

            foreach (var dbQ in this.questions.OrderBy(x => x.QuestionGroupHeading)
                     .ThenBy(x => x.UniversalSubCategory)
                     .ThenBy(x => x.QuestionId))
            {
                if (dbQ.QuestionGroupHeadingId != curGroupId)
                {
                    qg = new QuestionGroup()
                    {
                        GroupHeadingId    = dbQ.QuestionGroupHeadingId,
                        GroupHeadingText  = dbQ.QuestionGroupHeading,
                        StandardShortName = "Standard Questions"
                    };

                    groupList.Add(qg);

                    curGroupId   = qg.GroupHeadingId;
                    curPairingId = 0;

                    // start numbering again in new group
                    displayNumber = 0;
                }



                // new subcategory -- break on pairing ID to separate 'base' and 'custom' pairings
                if (dbQ.PairingId != curPairingId)
                {
                    sc = new QuestionSubCategory()
                    {
                        GroupHeadingId         = qg.GroupHeadingId,
                        SubCategoryId          = dbQ.UniversalSubCategoryId,
                        SubCategoryHeadingText = dbQ.UniversalSubCategory,
                        HeaderQuestionText     = dbQ.SubHeadingQuestionText,
                        SubCategoryAnswer      = this.subCatAnswers.Where(sca => sca.GroupHeadingId == qg.GroupHeadingId &&
                                                                          sca.SubCategoryId == dbQ.UniversalSubCategoryId)
                                                 .FirstOrDefault()?.AnswerText
                    };

                    qg.SubCategories.Add(sc);

                    curPairingId = dbQ.PairingId;
                }

                FullAnswer answer = this.Answers.Where(x => x.a.Question_Or_Requirement_Id == dbQ.QuestionId).FirstOrDefault();

                qa = new QuestionAnswer()
                {
                    DisplayNumber  = (++displayNumber).ToString(),
                    QuestionId     = dbQ.QuestionId,
                    QuestionText   = FormatLineBreaks(dbQ.SimpleQuestion),
                    Answer         = answer?.a?.Answer_Text,
                    Answer_Id      = answer?.a?.Answer_Id,
                    AltAnswerText  = answer?.a?.Alternate_Justification,
                    Comment        = answer?.a?.Comment,
                    Feedback       = answer?.a?.Feedback,
                    MarkForReview  = answer?.a.Mark_For_Review ?? false,
                    Reviewed       = answer?.a.Reviewed ?? false,
                    Is_Component   = answer?.a.Is_Component ?? false,
                    ComponentGuid  = answer?.a.Component_Guid ?? Guid.Empty,
                    Is_Requirement = answer?.a.Is_Requirement ?? false
                };
                if (answer != null)
                {
                    TinyMapper.Map <VIEW_QUESTIONS_STATUS, QuestionAnswer>(answer.b, qa);
                }

                sc.Questions.Add(qa);
            }

            QuestionResponse resp = new QuestionResponse
            {
                QuestionGroups  = groupList,
                ApplicationMode = this.applicationMode
            };

            resp.QuestionCount    = this.NumberOfQuestions();
            resp.RequirementCount = new RequirementsManager(this._assessmentId).NumberOfRequirements();

            BuildComponentsResponse(resp);
            return(resp);
        }
 public Task <QuestionSubCategory> Update(QuestionSubCategory questionCategory)
 {
     throw new System.NotImplementedException();
 }
Esempio n. 3
0
        /// <summary>
        /// Construct a response containing the applicable requirement questions with their answers.
        /// </summary>
        /// <param name="requirements"></param>
        /// <param name="answers"></param>
        /// <returns></returns>
        private QuestionResponse BuildResponse(List <RequirementPlus> requirements,
                                               List <FullAnswer> answers, List <DomainAssessmentFactor> domains)
        {
            List <QuestionGroup> groupList = new List <QuestionGroup>();
            QuestionGroup        g         = new QuestionGroup();
            QuestionSubCategory  sg        = new QuestionSubCategory();
            QuestionAnswer       qa        = new QuestionAnswer();

            string currentGroupHeading       = string.Empty;
            string currentSubcategoryHeading = string.Empty;

            try
            {
                foreach (var dbRPlus in requirements)
                {
                    var dbR = dbRPlus.Requirement;

                    // Make sure there are no leading or trailing spaces - it will affect the tree structure that is built
                    dbR.Standard_Category     = dbR.Standard_Category == null ? null : dbR.Standard_Category.Trim();
                    dbR.Standard_Sub_Category = dbR.Standard_Sub_Category == null ? null : dbR.Standard_Sub_Category.Trim();

                    // If the Standard_Sub_Category is null (like CSC_V6), default it to the Standard_Category
                    if (dbR.Standard_Sub_Category == null)
                    {
                        dbR.Standard_Sub_Category = dbR.Standard_Category;
                    }


                    if (dbR.Standard_Category != currentGroupHeading)
                    {
                        g = new QuestionGroup()
                        {
                            GroupHeadingId    = dbR.Question_Group_Heading_Id,
                            GroupHeadingText  = dbR.Standard_Category,
                            StandardShortName = dbRPlus.SetShortName,
                        };

                        if (domains.Any(x => x.AssessmentFactorName == g.GroupHeadingText))
                        {
                            g.DomainName = domains.FirstOrDefault(x => x.AssessmentFactorName == g.GroupHeadingText)
                                           .DomainName;
                        }

                        groupList.Add(g);

                        currentGroupHeading = g.GroupHeadingText;
                    }

                    // new subcategory
                    if (dbR.Standard_Sub_Category != currentSubcategoryHeading)
                    {
                        sg = new QuestionSubCategory()
                        {
                            SubCategoryId          = 0,
                            SubCategoryHeadingText = dbR.Standard_Sub_Category,
                            GroupHeadingId         = g.GroupHeadingId
                        };

                        g.SubCategories.Add(sg);

                        currentSubcategoryHeading = dbR.Standard_Sub_Category;
                    }


                    FullAnswer answer = answers.Where(x => x.a.Question_Or_Requirement_Id == dbR.Requirement_Id).FirstOrDefault();

                    qa = new QuestionAnswer()
                    {
                        DisplayNumber  = dbR.Requirement_Title,
                        QuestionId     = dbR.Requirement_Id,
                        QuestionText   = dbR.Requirement_Text.Replace("\r\n", "<br/>").Replace("\n", "<br/>").Replace("\r", "<br/>"),
                        Answer         = answer?.a.Answer_Text,
                        AltAnswerText  = answer?.a.Alternate_Justification,
                        Comment        = answer?.a.Comment,
                        Feedback       = answer?.a.Feedback,
                        MarkForReview  = answer?.a.Mark_For_Review ?? false,
                        Reviewed       = answer?.a.Reviewed ?? false,
                        MaturityLevel  = ReqMaturityLevel(dbR.Requirement_Id),
                        SetName        = dbRPlus.SetName,
                        Is_Component   = answer?.a.Is_Component ?? false,
                        Is_Requirement = answer?.a.Is_Requirement ?? true
                    };
                    if (answer != null)
                    {
                        TinyMapper.Map <VIEW_QUESTIONS_STATUS, QuestionAnswer>(answer.b, qa);
                    }

                    qa.ParmSubs = GetTokensForRequirement(qa.QuestionId, (answer != null) ? answer.a.Answer_Id : 0);

                    sg.Questions.Add(qa);
                }

                QuestionResponse resp = new QuestionResponse
                {
                    QuestionGroups  = groupList,
                    ApplicationMode = this.applicationMode
                };

                resp.QuestionCount    = new QuestionsManager(this._assessmentId).NumberOfQuestions();
                resp.RequirementCount = this.NumberOfRequirements();

                // Get the overall risk level
                var acetDash = new ACETDashboardManager().LoadDashboard(this._assessmentId);
                resp.OverallIRP = acetDash.SumRiskLevel;
                if (acetDash.Override > 0)
                {
                    resp.OverallIRP = acetDash.Override;
                }

                BuildComponentsResponse(resp);

                return(resp);
            }
            catch (Exception e)
            {
                throw e;
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Construct a response containing the applicable requirement questions with their answers.
        /// </summary>
        /// <param name="requirements"></param>
        /// <param name="answers"></param>
        /// <returns></returns>
        private QuestionResponse BuildResponse(List <RequirementPlus> requirements,
                                               List <FullAnswer> answers)
        {
            List <QuestionGroup> groupList = new List <QuestionGroup>();
            QuestionGroup        g         = new QuestionGroup();
            QuestionSubCategory  sg        = new QuestionSubCategory();
            QuestionAnswer       qa        = new QuestionAnswer();

            string currentGroupHeading       = string.Empty;
            string currentSubcategoryHeading = string.Empty;


            foreach (var dbRPlus in requirements)
            {
                var dbR = dbRPlus.Requirement;

                // If the Standard_Sub_Category is null (like CSC_V6), default it to the Standard_Category
                if (dbR.Standard_Sub_Category == null)
                {
                    dbR.Standard_Sub_Category = dbR.Standard_Category;
                }


                if (dbR.Standard_Category != currentGroupHeading)
                {
                    g = new QuestionGroup()
                    {
                        GroupHeadingId    = dbR.Question_Group_Heading_Id,
                        GroupHeadingText  = dbR.Standard_Category,
                        StandardShortName = dbRPlus.SetShortName
                    };

                    groupList.Add(g);

                    currentGroupHeading = g.GroupHeadingText;
                }

                // new subcategory
                if (dbR.Standard_Sub_Category != currentSubcategoryHeading)
                {
                    sg = new QuestionSubCategory()
                    {
                        SubCategoryId          = 0,
                        SubCategoryHeadingText = dbR.Standard_Sub_Category,
                        GroupHeadingId         = g.GroupHeadingId
                    };

                    g.SubCategories.Add(sg);

                    currentSubcategoryHeading = dbR.Standard_Sub_Category;
                }



                FullAnswer answer = answers.Where(x => x.a.Question_Or_Requirement_Id == dbR.Requirement_Id).FirstOrDefault();


                qa = new QuestionAnswer()
                {
                    DisplayNumber = dbR.Requirement_Title,
                    QuestionId    = dbR.Requirement_Id,
                    QuestionText  = dbR.Requirement_Text.Replace("\r\n", "<br/>").Replace("\n", "<br/>").Replace("\r", "<br/>"),
                    Answer        = answer?.a.Answer_Text,
                    AltAnswerText = answer?.a.Alternate_Justification,
                    Comment       = answer?.a.Comment,
                    MarkForReview = answer?.a.Mark_For_Review ?? false,
                    Reviewed      = answer?.a.Reviewed ?? false
                };
                if (answer != null)
                {
                    TinyMapper.Map <VIEW_QUESTIONS_STATUS, QuestionAnswer>(answer.b, qa);
                }

                qa.ParmSubs = GetTokensForRequirement(qa.QuestionId, (answer != null) ? answer.a.Answer_Id : 0);

                sg.Questions.Add(qa);
            }

            QuestionResponse resp = new QuestionResponse
            {
                QuestionGroups  = groupList,
                ApplicationMode = this.applicationMode
            };

            resp.QuestionCount    = new QuestionsManager(this._assessmentId).NumberOfQuestions();
            resp.RequirementCount = this.NumberOfRequirements();

            return(resp);
        }
Esempio n. 5
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="requirements"></param>
        /// <param name="answers"></param>
        /// <param name="domains"></param>
        /// <returns></returns>
        private QuestionResponse BuildResponse(List <RequirementPlus> requirements,
                                               List <FullAnswer> answers, List <DomainAssessmentFactor> domains)
        {
            var response = new QuestionResponse
            {
                Domains = new List <Domain>()
            };

            // ACET will pass a collection of domains.
            // Build a container for each domain.  Empty domains are removed at the end of the method.
            foreach (var d in domains.Select(d => d.DomainName).Distinct())
            {
                response.Domains.Add(new Domain()
                {
                    DisplayText = d,
                    DomainText  = d
                });
            }


            foreach (var req in requirements)
            {
                var dbR = req.Requirement;

                // Make sure there are no leading or trailing spaces - it will affect the tree structure that is built
                if (dbR.Standard_Category != null)
                {
                    dbR.Standard_Category = dbR.Standard_Category.Trim();
                }
                if (dbR.Standard_Sub_Category != null)
                {
                    dbR.Standard_Sub_Category = dbR.Standard_Sub_Category.Trim();
                }

                // If the Standard_Sub_Category is null (like CSC_V6), default it to the Standard_Category
                if (dbR.Standard_Sub_Category == null)
                {
                    dbR.Standard_Sub_Category = dbR.Standard_Category;
                }

                Domain set = null;


                // see if there's a domain whose 'assessment factor' (category) matches the requirement's category
                var targetDomain = domains.Where(d => d.AssessmentFactorName == dbR.Standard_Category).FirstOrDefault();
                if (targetDomain != null)
                {
                    set = response.Domains.Where(s => s.DomainText == targetDomain.DomainName).FirstOrDefault();
                    if (set == null)
                    {
                        set = new Domain()
                        {
                            DomainText  = targetDomain.DomainName,
                            DisplayText = targetDomain.DomainName
                        };
                        response.Domains.Add(set);
                    }
                }


                // find or create the set (using the Domain class as the set container)
                if (set == null)
                {
                    set = response.Domains.Where(s => s.SetName == req.SetName).FirstOrDefault();
                    if (set == null)
                    {
                        set = new Domain()
                        {
                            SetShortName = req.SetShortName,
                            SetName      = req.SetName
                        };
                        response.Domains.Add(set);
                    }
                }


                // find or create the category
                var category = set.Categories.Where(cat => cat.GroupHeadingText == dbR.Standard_Category).FirstOrDefault();
                if (category == null)
                {
                    category = new QuestionGroup()
                    {
                        GroupHeadingText = dbR.Standard_Category
                    };
                    set.Categories.Add(category);
                }


                // find or create subcategory
                var subcat = category.SubCategories.Where(sub => sub.SubCategoryHeadingText == dbR.Standard_Sub_Category).FirstOrDefault();
                if (subcat == null)
                {
                    subcat = new QuestionSubCategory()
                    {
                        SubCategoryId          = 0,
                        SubCategoryHeadingText = dbR.Standard_Sub_Category
                    };
                    category.SubCategories.Add(subcat);
                }


                // add the question+answer into the subcategory
                FullAnswer answer = answers.Where(x => x.a.Question_Or_Requirement_Id == dbR.Requirement_Id).FirstOrDefault();

                var qa = new QuestionAnswer()
                {
                    DisplayNumber  = dbR.Requirement_Title,
                    QuestionId     = dbR.Requirement_Id,
                    QuestionText   = dbR.Requirement_Text.Replace("\r\n", "<br/>").Replace("\n", "<br/>").Replace("\r", "<br/>"),
                    Answer         = answer?.a.Answer_Text,
                    AltAnswerText  = answer?.a.Alternate_Justification,
                    Comment        = answer?.a.Comment,
                    Feedback       = answer?.a.Feedback,
                    MarkForReview  = answer?.a.Mark_For_Review ?? false,
                    Reviewed       = answer?.a.Reviewed ?? false,
                    MaturityLevel  = ReqMaturityLevel(dbR.Requirement_Id),
                    SetName        = req.SetName,
                    Is_Component   = answer?.a.Is_Component ?? false,
                    Is_Requirement = answer?.a.Is_Requirement ?? true
                };
                if (answer != null)
                {
                    TinyMapper.Bind <VIEW_QUESTIONS_STATUS, QuestionAnswer>();
                    TinyMapper.Map <VIEW_QUESTIONS_STATUS, QuestionAnswer>(answer.b, qa);
                }

                qa.ParmSubs = GetTokensForRequirement(qa.QuestionId, (answer != null) ? answer.a.Answer_Id : 0);

                subcat.Questions.Add(qa);
            }

            // remove any empty 'domains'
            response.Domains = response.Domains.Where(d => d.Categories.Count > 0).ToList();

            response.ApplicationMode  = this.ApplicationMode;
            response.QuestionCount    = new QuestionsManager(this.assessmentID).NumberOfQuestions();
            response.RequirementCount = this.NumberOfRequirements();

            var j = JsonConvert.SerializeObject(response);

            return(response);
        }
Esempio n. 6
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="resp"></param>
        /// <param name="context"></param>
        /// <param name="list"></param>
        /// <param name="listname"></param>
        private void AddResponseComponentOverride(QuestionResponse resp, CSET_Context context, List <Answer_Components_Base> list, string listname)
        {
            List <QuestionGroup> groupList = new List <QuestionGroup>();
            QuestionGroup        qg        = new QuestionGroup();
            QuestionSubCategory  sc        = new QuestionSubCategory();
            QuestionAnswer       qa        = new QuestionAnswer();

            string symbolType      = null;
            string componentName   = null;
            string curGroupHeading = null;
            string curSubHeading   = null;
            int    prevQuestionId  = 0;
            QuestionSubCategoryComparator comparator = new QuestionSubCategoryComparator();

            int displayNumber = 0;

            //push a new group if component_type, component_name, or question_group_heading changes

            foreach (var dbQ in list)
            {
                if ((dbQ.Symbol_Name != symbolType) ||
                    (dbQ.ComponentName != componentName))
                {
                    qg = new QuestionGroup()
                    {
                        GroupHeadingText  = dbQ.Question_Group_Heading,
                        GroupHeadingId    = dbQ.GroupHeadingId,
                        StandardShortName = listname,
                        Symbol_Name       = dbQ.Symbol_Name,
                        ComponentName     = dbQ.ComponentName,
                        IsOverride        = true
                    };
                    groupList.Add(qg);
                    symbolType    = dbQ.Symbol_Name;
                    componentName = dbQ.ComponentName;

                    curGroupHeading = qg.GroupHeadingText;
                    // start numbering again in new group
                    displayNumber = 0;
                }

                // new subcategory -- break on pairing ID to separate 'base' and 'custom' pairings
                if ((dbQ.Universal_Sub_Category != curSubHeading) || (dbQ.Question_Id == prevQuestionId))
                {
                    sc = new QuestionSubCategory()
                    {
                        GroupHeadingId         = dbQ.GroupHeadingId,
                        SubCategoryId          = dbQ.SubCategoryId,
                        SubCategoryHeadingText = dbQ.Universal_Sub_Category,
                        HeaderQuestionText     = dbQ.Sub_Heading_Question_Description,
                        SubCategoryAnswer      = this.subCatAnswers.Where(x => x.HeadingId == dbQ.heading_pair_id).FirstOrDefault()?.AnswerText
                    };

                    qg.SubCategories.Add(sc);
                    curSubHeading = dbQ.Universal_Sub_Category;
                }
                prevQuestionId = dbQ.Question_Id;
                qa             = new QuestionAnswer()
                {
                    DisplayNumber  = (++displayNumber).ToString(),
                    QuestionId     = dbQ.Question_Id,
                    QuestionText   = FormatLineBreaks(dbQ.Simple_Question),
                    Answer         = dbQ.Answer_Text,
                    Answer_Id      = dbQ.Answer_Id,
                    AltAnswerText  = dbQ.Alternate_Justification,
                    Comment        = dbQ.Comment,
                    MarkForReview  = dbQ.Mark_For_Review ?? false,
                    Reviewed       = dbQ.Reviewed ?? false,
                    Is_Component   = dbQ.Is_Component,
                    ComponentGuid  = dbQ.Component_Guid ?? Guid.Empty,
                    Is_Requirement = dbQ.Is_Requirement,
                    Feedback       = dbQ.Feedback
                };

                sc.Questions.Add(qa);
            }


            resp.Domains[0].Categories.AddRange(groupList);
            resp.QuestionCount         += list.Count;
            resp.DefaultComponentsCount = list.Count;
        }
Esempio n. 7
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="resp"></param>
        /// <param name="context"></param>
        /// <param name="list"></param>
        /// <param name="listname"></param>
        private void AddResponse(QuestionResponse resp, CSET_Context context, List <Answer_Components_Base> list, string listname)
        {
            List <QuestionGroup> groupList = new List <QuestionGroup>();
            QuestionGroup        qg        = new QuestionGroup();
            QuestionSubCategory  sc        = new QuestionSubCategory();
            QuestionAnswer       qa        = new QuestionAnswer();

            string curGroupHeading  = null;
            int    curHeadingPairId = 0;


            int displayNumber = 0;


            foreach (var dbQ in list)
            {
                if (dbQ.Question_Group_Heading != curGroupHeading)
                {
                    qg = new QuestionGroup()
                    {
                        GroupHeadingText  = dbQ.Question_Group_Heading,
                        GroupHeadingId    = dbQ.GroupHeadingId,
                        StandardShortName = listname,
                        Symbol_Name       = dbQ.Symbol_Name,
                        ComponentName     = dbQ.ComponentName
                    };
                    groupList.Add(qg);
                    curGroupHeading = qg.GroupHeadingText;
                    // start numbering again in new group
                    displayNumber = 0;
                }

                // new subcategory -- break on pairing ID to separate 'base' and 'custom' pairings
                if (dbQ.heading_pair_id != curHeadingPairId)
                {
                    sc = new QuestionSubCategory()
                    {
                        GroupHeadingId         = dbQ.GroupHeadingId,
                        SubCategoryId          = dbQ.SubCategoryId,
                        SubCategoryHeadingText = dbQ.Universal_Sub_Category,
                        HeaderQuestionText     = dbQ.Sub_Heading_Question_Description,
                        SubCategoryAnswer      = this.subCatAnswers.Where(x => x.HeadingId == dbQ.heading_pair_id).FirstOrDefault()?.AnswerText
                    };

                    qg.SubCategories.Add(sc);

                    curHeadingPairId = dbQ.heading_pair_id;
                }

                qa = new QuestionAnswer()
                {
                    DisplayNumber = (++displayNumber).ToString(),
                    QuestionId    = dbQ.Question_Id,
                    QuestionType  = "Component",
                    QuestionText  = FormatLineBreaks(dbQ.Simple_Question),
                    Answer        = dbQ.Answer_Text,
                    Answer_Id     = dbQ.Answer_Id,
                    AltAnswerText = dbQ.Alternate_Justification,
                    Comment       = dbQ.Comment,
                    MarkForReview = dbQ.Mark_For_Review ?? false,
                    Reviewed      = dbQ.Reviewed ?? false,
                    ComponentGuid = dbQ.Component_Guid ?? Guid.Empty,
                    Feedback      = dbQ.Feedback
                };

                sc.Questions.Add(qa);
            }


            var container = new Domain()
            {
                DisplayText = listname
            };

            container.Categories.AddRange(groupList);
            resp.Domains.Add(container);
            resp.QuestionCount         += list.Count;
            resp.DefaultComponentsCount = list.Count;
        }
Esempio n. 8
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="assessmentId"></param>
        public object GetMaturityQuestions(int assessmentId)
        {
            // Populate response
            var response = new QuestionResponse
            {
                Domains = new List <Domain>()
            };


            using (var db = new CSET_Context())
            {
                var myModel = db.AVAILABLE_MATURITY_MODELS
                              .Include(x => x.model_)
                              .Where(x => x.Assessment_Id == assessmentId).FirstOrDefault();

                if (myModel == null)
                {
                    return(response);
                }

                // see if any answer options should not be in the list
                var suppressedAnswerOptions = myModel.model_.Answer_Options_Suppressed;
                if (!string.IsNullOrEmpty(suppressedAnswerOptions))
                {
                    var a = suppressedAnswerOptions.Split(',');
                    foreach (string suppress in a)
                    {
                        response.AnswerOptions.Remove(suppress);
                    }
                }


                // The maturity target level is stored similar to a SAL level
                int targetLevel = 0;
                var myLevel     = db.ASSESSMENT_SELECTED_LEVELS.Where(x => x.Assessment_Id == assessmentId && x.Level_Name == "Maturity_Level").FirstOrDefault();
                if (myLevel != null)
                {
                    targetLevel = int.Parse(myLevel.Standard_Specific_Sal_Level);
                }

                // get the level display names
                // (for now assume that the assessment uses a single model)
                var levelNames = new List <MaturityLevel>();
                foreach (var l in db.MATURITY_LEVELS.Where(x => x.Maturity_Model_Id == myModel.model_id)
                         .OrderBy(y => y.Level).ToList())
                {
                    levelNames.Add(new MaturityLevel()
                    {
                        Level      = l.Level,
                        Label      = l.Level_Name,
                        Applicable = l.Level <= targetLevel
                    });
                }


                // Get all maturity questions for the model regardless of level
                // The user can choose to see questions above the target level via filtering.
                var questions = db.MATURITY_QUESTIONS.Where(q =>
                                                            myModel.model_id == q.Maturity_Model_Id).ToList();


                // Get all MATURITY answers for the assessment
                var answers = from a in db.ANSWER.Where(x => x.Assessment_Id == assessmentId && x.Is_Maturity)
                              from b in db.VIEW_QUESTIONS_STATUS.Where(x => x.Answer_Id == a.Answer_Id).DefaultIfEmpty()
                              select new FullAnswer()
                {
                    a = a, b = b
                };



                // CMMC has 17 domains, which correspond to Categories in the
                // MATURITY_QUESTIONS table.
                // TODO:  Eventually they should probably be defined in a new generic
                // MATURITY_DOMAINS table.
                var domains = questions.Select(x => x.Category).Distinct().ToList();

                // build a container for each domain
                foreach (var d in domains)
                {
                    response.Domains.Add(new Domain()
                    {
                        DisplayText = d,
                        DomainText  = d,
                        Levels      = levelNames
                    });
                }

                foreach (var dbR in questions)
                {
                    // Make sure there are no leading or trailing spaces - it will affect the tree structure that is built
                    dbR.Category     = dbR.Category ?? dbR.Category.Trim();
                    dbR.Sub_Category = dbR.Sub_Category ?? dbR.Sub_Category.Trim();

                    // If the Standard_Sub_Category is null (like CSC_V6), default it to the Standard_Category
                    if (dbR.Sub_Category == null)
                    {
                        dbR.Sub_Category = dbR.Category;
                    }


                    var json = JsonConvert.SerializeObject(response);

                    // drop into the domain
                    var targetDomain = response.Domains.Where(cc => cc.DomainText == dbR.Category).FirstOrDefault();
                    if (targetDomain != null)
                    {
                        // find or create a Category
                        var targetCat = targetDomain.Categories.Where(c => c.GroupHeadingText == dbR.Category).FirstOrDefault();
                        if (targetCat == null)
                        {
                            targetCat = new QuestionGroup()
                            {
                                GroupHeadingText = dbR.Category
                            };
                            targetDomain.Categories.Add(targetCat);
                        }


                        // find or create a Subcategory
                        var targetSubcat = targetCat.SubCategories.Where(sc => sc.SubCategoryHeadingText == dbR.Sub_Category).FirstOrDefault();
                        if (targetSubcat == null)
                        {
                            targetSubcat = new QuestionSubCategory()
                            {
                                SubCategoryId          = 0,
                                SubCategoryHeadingText = dbR.Sub_Category,
                                // GroupHeadingId = g.GroupHeadingId
                            };

                            targetCat.SubCategories.Add(targetSubcat);
                        }



                        FullAnswer answer = answers.Where(x => x.a.Question_Or_Requirement_Id == dbR.Mat_Question_Id).FirstOrDefault();

                        var qa = new QuestionAnswer()
                        {
                            DisplayNumber  = dbR.Question_Title,
                            QuestionId     = dbR.Mat_Question_Id,
                            QuestionText   = dbR.Question_Text.Replace("\r\n", "<br/>").Replace("\n", "<br/>").Replace("\r", "<br/>"),
                            Answer         = answer?.a.Answer_Text,
                            AltAnswerText  = answer?.a.Alternate_Justification,
                            Comment        = answer?.a.Comment,
                            Feedback       = answer?.a.Feedback,
                            MarkForReview  = answer?.a.Mark_For_Review ?? false,
                            Reviewed       = answer?.a.Reviewed ?? false,
                            MaturityLevel  = dbR.Maturity_Level,
                            SetName        = string.Empty,
                            Is_Maturity    = answer?.a.Is_Maturity ?? true,
                            Is_Component   = answer?.a.Is_Component ?? false,
                            Is_Requirement = answer?.a.Is_Requirement ?? false
                        };
                        if (answer != null)
                        {
                            TinyMapper.Bind <VIEW_QUESTIONS_STATUS, QuestionAnswer>();
                            TinyMapper.Map(answer.b, qa);
                        }

                        qa.ParmSubs = null;

                        targetSubcat.Questions.Add(qa);
                    }
                }

                return(response);
            }
        }