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