예제 #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);
        }
예제 #2
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);
        }
예제 #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;
            }
        }
예제 #4
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);
        }