/// <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(); }
/// <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; } }
/// <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); }
/// <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); }
/// <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; }
/// <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; }
/// <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); } }