/// <summary> /// Removes a Contact/User from an Assessment. /// Currently we actually delete the ASSESSMENT_CONTACTS record. /// </summary> public List <ContactDetail> RemoveContact(int assessmentContactId) { using (var db = new CSET_Context()) { var ac = (from cc in db.ASSESSMENT_CONTACTS where cc.Assessment_Contact_Id == assessmentContactId select cc).FirstOrDefault(); if (ac == null) { throw new NoSuchUserException(); } db.ASSESSMENT_CONTACTS.Remove(ac); // Remove any related FINDING_CONTACT records var fcList = (from fcc in db.FINDING_CONTACT where fcc.Assessment_Contact_Id == ac.Assessment_Contact_Id select fcc).ToList(); if (fcList.Count > 0) { db.FINDING_CONTACT.RemoveRange(fcList); } db.SaveChanges(); AssessmentUtil.TouchAssessment(ac.Assessment_Id); return(GetContacts(ac.Assessment_Id)); } }
/// <summary> /// Saves the list of selected Standards. /// </summary> /// <param name="selectedStandards"></param> /// <returns></returns> public QuestionRequirementCounts PersistSelectedStandards(int assessmentId, List <string> selectedStandards) { using (var db = new CSET_Context()) { var result = db.AVAILABLE_STANDARDS.Where(x => x.Assessment_Id == assessmentId); db.AVAILABLE_STANDARDS.RemoveRange(result); // If we were handed an empty list, get the default standards if (selectedStandards.Count == 1 && selectedStandards[0] == "***DEFAULT***") { selectedStandards = GetDefaultStandardsList(); } foreach (string std in selectedStandards) { db.AVAILABLE_STANDARDS.Add(new AVAILABLE_STANDARDS() { Assessment_Id = assessmentId, Set_Name = std, Selected = true }); } db.SaveChanges(); } AssessmentUtil.TouchAssessment(assessmentId); // Return the numbers of active Questions and Requirements QuestionRequirementCounts counts = new QuestionRequirementCounts(); counts.QuestionCount = new QuestionsManager(assessmentId).NumberOfQuestions(); counts.RequirementCount = new RequirementsManager(assessmentId).NumberOfRequirements(); return(counts); }
/// <summary> /// Stores an answer. /// </summary> /// <param name="answer"></param> public int StoreAnswer(Answer answer) { var db = new CSET_Context(); // Find the Question or Requirement var question = db.NEW_QUESTION.Where(q => q.Question_Id == answer.QuestionId).FirstOrDefault(); var requirement = db.NEW_REQUIREMENT.Where(r => r.Requirement_Id == answer.QuestionId).FirstOrDefault(); if (question == null && requirement == null) { throw new Exception("Unknown question or requirement ID: " + answer.QuestionId); } // in case a null is passed, store 'unanswered' if (string.IsNullOrEmpty(answer.AnswerText)) { answer.AnswerText = "U"; } ANSWER dbAnswer = null; if (answer != null && answer.ComponentGuid != Guid.Empty) { dbAnswer = db.ANSWER.Where(x => x.Assessment_Id == _assessmentId && x.Question_Or_Requirement_Id == answer.QuestionId && x.Is_Requirement == answer.Is_Requirement && x.Component_Guid == answer.ComponentGuid).FirstOrDefault(); } else if (answer != null) { dbAnswer = db.ANSWER.Where(x => x.Assessment_Id == _assessmentId && x.Question_Or_Requirement_Id == answer.QuestionId && x.Is_Requirement == answer.Is_Requirement).FirstOrDefault(); } if (dbAnswer == null) { dbAnswer = new ANSWER(); } dbAnswer.Assessment_Id = _assessmentId; dbAnswer.Question_Or_Requirement_Id = answer.QuestionId; dbAnswer.Question_Number = answer.QuestionNumber; dbAnswer.Is_Requirement = answer.Is_Requirement; dbAnswer.Answer_Text = answer.AnswerText; dbAnswer.Alternate_Justification = answer.AltAnswerText; dbAnswer.Comment = answer.Comment; dbAnswer.FeedBack = answer.FeedBack; dbAnswer.Mark_For_Review = answer.MarkForReview; dbAnswer.Reviewed = answer.Reviewed; dbAnswer.Component_Guid = answer.ComponentGuid; dbAnswer.Is_Component = answer.Is_Component; db.ANSWER.AddOrUpdate(dbAnswer, x => x.Answer_Id); db.SaveChanges(); AssessmentUtil.TouchAssessment(_assessmentId); return(dbAnswer.Answer_Id); }
/// <summary> /// Connects the assessment to a Maturity_Level. /// </summary> public void PersistMaturityLevel(int assessmentId, int level) { using (var db = new CSET_Context()) { // SAL selections live in ASSESSMENT_SELECTED_LEVELS, which // is more complex to allow for the different types of SALs // as well as the user's selection(s). var result = db.ASSESSMENT_SELECTED_LEVELS.Where(x => x.Assessment_Id == assessmentId && x.Level_Name == "Maturity_Level"); if (result.Any()) { db.ASSESSMENT_SELECTED_LEVELS.RemoveRange(result); db.SaveChanges(); } db.ASSESSMENT_SELECTED_LEVELS.Add(new ASSESSMENT_SELECTED_LEVELS() { Assessment_Id = assessmentId, Level_Name = "Maturity_Level", Standard_Specific_Sal_Level = level.ToString() }); db.SaveChanges(); } AssessmentUtil.TouchAssessment(assessmentId); }
/// <summary> /// Clears any other selected standards and adds the default standard. /// </summary> /// <param name="assessmentId"></param> /// <returns></returns> public QuestionRequirementCounts PersistDefaultSelectedStandard(int assessmentId) { using (var db = new CSET_Context()) { var result = db.AVAILABLE_STANDARDS.Where(x => x.Assessment_Id == assessmentId); db.AVAILABLE_STANDARDS.RemoveRange(result); var selectedStandards = GetDefaultStandardsList(); if (selectedStandards.Any()) { foreach (string std in selectedStandards) { db.AVAILABLE_STANDARDS.Add(new AVAILABLE_STANDARDS() { Assessment_Id = assessmentId, Set_Name = std, Selected = true }); } db.SaveChanges(); } } AssessmentUtil.TouchAssessment(assessmentId); // Return the numbers of active Questions and Requirements QuestionRequirementCounts counts = new QuestionRequirementCounts(); counts.QuestionCount = new QuestionsManager(assessmentId).NumberOfQuestions(); counts.RequirementCount = new RequirementsManager(assessmentId).NumberOfRequirements(); return(counts); }
/// <summary> /// Persists a single answer to the SUB_CATEGORY_ANSWERS table for the 'block answer', /// and flips all of the constituent questions' answers. /// </summary> public void StoreSubcategoryAnswers(SubCategoryAnswers subCatAnswerBlock) { if (subCatAnswerBlock == null) { return; } // SUB_CATEGORY_ANSWERS var db = new CSET_Context(); // Get the USCH so that we will know the Heading_Pair_Id var usch = db.UNIVERSAL_SUB_CATEGORY_HEADINGS.Where(u => u.Question_Group_Heading_Id == subCatAnswerBlock.GroupHeadingId && u.Universal_Sub_Category_Id == subCatAnswerBlock.SubCategoryId).FirstOrDefault(); var subCatAnswer = db.SUB_CATEGORY_ANSWERS.Where(sca => sca.Assessement_Id == assessmentID && sca.Heading_Pair_Id == usch.Heading_Pair_Id).FirstOrDefault(); if (subCatAnswer == null) { subCatAnswer = new SUB_CATEGORY_ANSWERS(); } subCatAnswer.Assessement_Id = assessmentID; subCatAnswer.Heading_Pair_Id = usch.Heading_Pair_Id; subCatAnswer.Answer_Text = subCatAnswerBlock.SubCategoryAnswer; db.SUB_CATEGORY_ANSWERS.AddOrUpdate(subCatAnswer, x => x.Assessement_Id, x => x.Heading_Pair_Id); db.SaveChanges(); AssessmentUtil.TouchAssessment(assessmentID); // loop and store all of the subcategory's answers foreach (Answer ans in subCatAnswerBlock.Answers) { if (String.IsNullOrWhiteSpace(ans.QuestionType)) { if (ans.Is_Component) { ans.QuestionType = "Component"; } if (ans.Is_Maturity) { ans.QuestionType = "Maturity"; } if (ans.Is_Requirement) { ans.QuestionType = "Requirement"; } if (!ans.Is_Requirement && !ans.Is_Maturity && !ans.Is_Component) { ans.QuestionType = "Question"; } } StoreAnswer(ans); } }
/// <summary> /// Removes a Contact/User from an Assessment. /// Currently we actually delete the ASSESSMENT_CONTACTS record. /// </summary> public List <ContactDetail> RemoveContact(int assessmentContactId) { using (var db = new CSET_Context()) { var ac = (from cc in db.ASSESSMENT_CONTACTS where cc.Assessment_Contact_Id == assessmentContactId select cc).FirstOrDefault(); if (ac == null) { throw new NoSuchUserException(); } db.ASSESSMENT_CONTACTS.Remove(ac); // Remove any related FINDING_CONTACT records var fcList = (from fcc in db.FINDING_CONTACT where fcc.Assessment_Contact_Id == ac.Assessment_Contact_Id select fcc).ToList(); if (fcList.Count > 0) { db.FINDING_CONTACT.RemoveRange(fcList); } // Null out any related Facilitator or Point of Contact references var demoList1 = (from x in db.DEMOGRAPHICS where x.Facilitator == ac.Assessment_Contact_Id select x).ToList(); foreach (var dd in demoList1) { dd.Facilitator = null; } var demoList2 = (from x in db.DEMOGRAPHICS where x.PointOfContact == ac.Assessment_Contact_Id select x).ToList(); foreach (var dd in demoList2) { dd.PointOfContact = null; } db.SaveChanges(); AssessmentUtil.TouchAssessment(ac.Assessment_Id); return(GetContacts(ac.Assessment_Id)); } }
/// <summary> /// Saves a new text value override in a PARAMETER_ASSESSMENT row. /// </summary> /// <param name="requirementId"></param> /// <param name="parameterId"></param> /// <param name="answerId"></param> /// <param name="newText"></param> /// <returns></returns> public ParameterToken SaveAssessmentParameter(int parameterId, string newText) { using (var db = new CSET_Context()) { // If an empty value is supplied, delete the PARAMETER_VALUES row. if (string.IsNullOrEmpty(newText)) { var g = db.PARAMETER_ASSESSMENT.Where(p => p.Parameter_ID == parameterId && p.Assessment_ID == this._assessmentId).FirstOrDefault(); if (g != null) { db.PARAMETER_ASSESSMENT.Remove(g); db.SaveChanges(); } AssessmentUtil.TouchAssessment(_assessmentId); // build a partial return object just to inform the UI what the new value is var baseParameter = db.PARAMETERS.Where(p => p.Parameter_ID == parameterId).First(); return(new ParameterToken(baseParameter.Parameter_ID, "", baseParameter.Parameter_Name, 0, 0)); } // Otherwise, insert or update the PARAMETER_ASSESSMENT record var pa = db.PARAMETER_ASSESSMENT.Where(p => p.Parameter_ID == parameterId && p.Assessment_ID == this._assessmentId).FirstOrDefault(); if (pa == null) { pa = new PARAMETER_ASSESSMENT(); } pa.Assessment_ID = this._assessmentId; pa.Parameter_ID = parameterId; pa.Parameter_Value_Assessment = newText; if (db.PARAMETER_ASSESSMENT.Find(pa.Parameter_ID, pa.Assessment_ID) == null) { db.PARAMETER_ASSESSMENT.Add(pa); } else { db.PARAMETER_ASSESSMENT.Update(pa); } db.SaveChanges(); AssessmentUtil.TouchAssessment(_assessmentId); // build a partial return object just to inform the UI what the new value is return(new ParameterToken(pa.Parameter_ID, "", pa.Parameter_Value_Assessment, 0, 0)); } }
/// <summary> /// Stores the requested application mode in the STANDARD_SELECTION table. /// </summary> /// <param name="mode"></param> public void SetApplicationMode(string mode) { var db = new CSET_Context(); var standardSelection = db.STANDARD_SELECTION.Where(x => x.Assessment_Id == assessmentID).FirstOrDefault(); if (standardSelection != null) { standardSelection.Application_Mode = (mode == "Q") ? "Questions Based" : "Requirements Based"; db.STANDARD_SELECTION.AddOrUpdate(standardSelection, x => x.Assessment_Id); db.SaveChanges(); } AssessmentUtil.TouchAssessment(assessmentID); }
/// <summary> /// Stores an answer. /// </summary> /// <param name="answer"></param> public int StoreAnswer(int assessmentId, Answer answer) { var db = new CSET_Context(); // Find the Maturity Question var question = db.MATURITY_QUESTIONS.Where(q => q.Mat_Question_Id == answer.QuestionId).FirstOrDefault(); if (question == null) { throw new Exception("Unknown question or requirement ID: " + answer.QuestionId); } // in case a null is passed, store 'unanswered' if (string.IsNullOrEmpty(answer.AnswerText)) { answer.AnswerText = "U"; } ANSWER dbAnswer = db.ANSWER.Where(x => x.Assessment_Id == assessmentId && x.Question_Or_Requirement_Id == answer.QuestionId && x.Is_Requirement == answer.Is_Requirement).FirstOrDefault(); if (dbAnswer == null) { dbAnswer = new ANSWER(); } dbAnswer.Assessment_Id = assessmentId; dbAnswer.Question_Or_Requirement_Id = answer.QuestionId; dbAnswer.Question_Number = answer.QuestionNumber; dbAnswer.Answer_Text = answer.AnswerText; dbAnswer.Alternate_Justification = answer.AltAnswerText; dbAnswer.Comment = answer.Comment; dbAnswer.Feedback = answer.Feedback; dbAnswer.Mark_For_Review = answer.MarkForReview; dbAnswer.Reviewed = answer.Reviewed; dbAnswer.Is_Maturity = answer.Is_Maturity; dbAnswer.Is_Component = answer.Is_Component; dbAnswer.Component_Guid = answer.ComponentGuid; dbAnswer.Is_Requirement = answer.Is_Requirement; db.ANSWER.AddOrUpdate(dbAnswer, x => x.Answer_Id); db.SaveChanges(); AssessmentUtil.TouchAssessment(assessmentId); return(dbAnswer.Answer_Id); }
/// <summary> /// Persists data to the ASSESSMENTS and INFORMATION tables. /// Date fields should be converted to UTC before sending the Assessment /// to this method. /// </summary> /// <param name="assessment"></param> /// <returns></returns> public int SaveAssessmentDetail(int assessmentId, AssessmentDetail assessment) { var db = new DataLayerCore.Model.CSET_Context(); TokenManager tm = new TokenManager(); string app_code = tm.Payload(Constants.Token_Scope); // Add or update the ASSESSMENT record var dbAssessment = new ASSESSMENTS() { Assessment_Id = assessment.Id, AssessmentCreatedDate = assessment.CreatedDate, AssessmentCreatorId = assessment.CreatorId, Assessment_Date = assessment.AssessmentDate ?? DateTime.Now, LastAccessedDate = assessment.LastModifiedDate, Charter = string.IsNullOrEmpty(assessment.Charter) ? string.Empty : assessment.Charter.PadLeft(5, '0'), CreditUnionName = assessment.CreditUnion, Assets = assessment.Assets, MatDetail_targetBandOnly = app_code == "ACET" }; db.ASSESSMENTS.AddOrUpdate(dbAssessment, x => x.Assessment_Id); db.SaveChanges(); assessmentId = dbAssessment.Assessment_Id; var user = db.USERS.FirstOrDefault(x => x.UserId == dbAssessment.AssessmentCreatorId); // then use its key for the INFORMATION record var dbInfo = new INFORMATION { Id = assessmentId, Assessment_Name = assessment.AssessmentName, Facility_Name = assessment.FacilityName, City_Or_Site_Name = assessment.CityOrSiteName, State_Province_Or_Region = assessment.StateProvRegion, Executive_Summary = assessment.ExecutiveSummary, Assessment_Description = assessment.AssessmentDescription, Additional_Notes_And_Comments = assessment.AdditionalNotesAndComments, IsAcetOnly = assessment.IsAcetOnly }; db.INFORMATION.AddOrUpdate(dbInfo, x => x.Id); db.SaveChanges(); AssessmentUtil.TouchAssessment(assessmentId); return(dbInfo.Id); }
/// <summary> /// Persists data to the ASSESSMENTS and INFORMATION tables. /// Date fields should be converted to UTC before sending the Assessment /// to this method. /// </summary> /// <param name="assessment"></param> /// <returns></returns> public int SaveAssessmentDetail(int assessmentId, AssessmentDetail assessment) { var db = new DataLayerCore.Model.CSET_Context(); // Add or update the ASSESSMENT record var dbAssessment = new ASSESSMENTS() { Assessment_Id = assessment.Id, AssessmentCreatedDate = assessment.CreatedDate, AssessmentCreatorId = assessment.CreatorId, Assessment_Date = assessment.AssessmentDate ?? DateTime.Now, LastAccessedDate = assessment.LastModifiedDate, Charter = assessment.Charter, CreditUnionName = assessment.CreditUnion, Assets = assessment.Assets }; db.ASSESSMENTS.AddOrUpdate(dbAssessment, x => x.Assessment_Id); db.SaveChanges(); assessmentId = dbAssessment.Assessment_Id; var user = db.USERS.FirstOrDefault(x => x.UserId == dbAssessment.AssessmentCreatorId); // then use its key for the INFORMATION record var dbInfo = new INFORMATION { Id = assessmentId, Assessment_Name = assessment.AssessmentName, Facility_Name = assessment.FacilityName, City_Or_Site_Name = assessment.CityOrSiteName, State_Province_Or_Region = assessment.StateProvRegion, Executive_Summary = assessment.ExecutiveSummary, Assessment_Description = assessment.AssessmentDescription, Additional_Notes_And_Comments = assessment.AdditionalNotesAndComments }; db.INFORMATION.AddOrUpdate(dbInfo, x => x.Id); db.SaveChanges(); AssessmentUtil.TouchAssessment(assessmentId); return(dbInfo.Id); }
/// <summary> /// Persists data to the DEMOGRAPHICS table. /// </summary> /// <param name="demographics"></param> /// <returns></returns> public int SaveDemographics(Demographics demographics) { var db = new CSET_Context(); // Convert Size and AssetValue from their keys to the strings they are stored as string assetValue = db.DEMOGRAPHICS_ASSET_VALUES.Where(dav => dav.DemographicsAssetId == demographics.AssetValue).FirstOrDefault()?.AssetValue; string assetSize = db.DEMOGRAPHICS_SIZE.Where(dav => dav.DemographicId == demographics.Size).FirstOrDefault()?.Size; // If the user selected nothing for sector or industry, store a null - 0 violates foreign key if (demographics.SectorId == 0) { demographics.SectorId = null; } if (demographics.IndustryId == 0) { demographics.IndustryId = null; } // Add or update the DEMOGRAPHICS record var dbDemographics = new DEMOGRAPHICS() { Assessment_Id = demographics.AssessmentId, IndustryId = demographics.IndustryId, SectorId = demographics.SectorId, Size = assetSize, AssetValue = assetValue, Facilitator = demographics.Facilitator == 0 ? null : demographics.Facilitator, PointOfContact = demographics.PointOfContact == 0 ? null : demographics.PointOfContact, IsScoped = demographics.IsScoped, Agency = demographics.Agency, OrganizationType = demographics.OrganizationType == 0 ? null : demographics.OrganizationType, OrganizationName = demographics.OrganizationName }; db.DEMOGRAPHICS.AddOrUpdate(dbDemographics, x => x.Assessment_Id); db.SaveChanges(); demographics.AssessmentId = dbDemographics.Assessment_Id; AssessmentUtil.TouchAssessment(dbDemographics.Assessment_Id); return(demographics.AssessmentId); }
/// <summary> /// Connects an existing USER to an existing ASSESSMENT for the specified role. /// TODO: Enforce no duplicates - a user should only be connected once. /// If a new role is supplied, update the existing ASSESSMENT_CONTACTS role. /// </summary> public ContactDetail AddContactToAssessment(int assessmentId, int userId, int roleid, bool invited) { using (var db = new CSET_Context()) { USERS user = db.USERS.Where(x => x.UserId == userId).First(); var dbAC = db.ASSESSMENT_CONTACTS.Where(ac => ac.Assessment_Id == assessmentId && ac.UserId == user.UserId).FirstOrDefault(); if (dbAC == null) { dbAC = new ASSESSMENT_CONTACTS { Assessment_Id = assessmentId, UserId = user.UserId, FirstName = user.FirstName, LastName = user.LastName, PrimaryEmail = user.PrimaryEmail, }; } dbAC.AssessmentRoleId = roleid; dbAC.Invited = invited; db.ASSESSMENT_CONTACTS.AddOrUpdate(dbAC, x => x.Assessment_Contact_Id); db.SaveChanges(); AssessmentUtil.TouchAssessment(assessmentId); // Return the full list of Contacts for the Assessment return(new ContactDetail { FirstName = dbAC.FirstName, LastName = dbAC.LastName, PrimaryEmail = dbAC.PrimaryEmail, AssessmentId = dbAC.Assessment_Id, AssessmentRoleId = dbAC.AssessmentRoleId, Invited = dbAC.Invited, UserId = dbAC.UserId ?? null }); } }
/// <summary> /// Persists a single answer to the SUB_CATEGORY_ANSWERS table for the 'block answer', /// and flips all of the constituent questions' answers. /// </summary> public void StoreSubcategoryAnswers(SubCategoryAnswers subCatAnswerBlock) { if (subCatAnswerBlock == null) { return; } // SUB_CATEGORY_ANSWERS var db = new CSET_Context(); // Get the USCH so that we will know the Heading_Pair_Id var usch = db.UNIVERSAL_SUB_CATEGORY_HEADINGS.Where(u => u.Question_Group_Heading_Id == subCatAnswerBlock.GroupHeadingId && u.Universal_Sub_Category_Id == subCatAnswerBlock.SubCategoryId).FirstOrDefault(); var subCatAnswer = db.SUB_CATEGORY_ANSWERS.Where(sca => sca.Assessement_Id == _assessmentId && sca.Heading_Pair_Id == usch.Heading_Pair_Id).FirstOrDefault(); if (subCatAnswer == null) { subCatAnswer = new SUB_CATEGORY_ANSWERS(); } subCatAnswer.Assessement_Id = _assessmentId; subCatAnswer.Heading_Pair_Id = usch.Heading_Pair_Id; subCatAnswer.Answer_Text = subCatAnswerBlock.SubCategoryAnswer; db.SUB_CATEGORY_ANSWERS.AddOrUpdate(subCatAnswer, x => x.Assessement_Id, x => x.Heading_Pair_Id); db.SaveChanges(); AssessmentUtil.TouchAssessment(_assessmentId); // loop and store all of the subcategory's answers foreach (Answer ans in subCatAnswerBlock.Answers) { StoreAnswer(ans); } }
/// <summary> /// Saves the selected maturity models. /// </summary> /// <returns></returns> public void PersistSelectedMaturityModel(int assessmentId, string modelName) { var model = dbb.MATURITY_MODELS.FirstOrDefault(x => x.Model_Name == modelName); if (model == null) { return; } var amm = dbb.AVAILABLE_MATURITY_MODELS.FirstOrDefault(x => x.model_id == model.Maturity_Model_Id && x.Assessment_Id == assessmentId); if (amm != null) { // we already have the model set; do nothing return; } ClearMaturityModel(assessmentId); var mm = dbb.MATURITY_MODELS.FirstOrDefault(x => x.Model_Name == modelName); if (mm != null) { dbb.AVAILABLE_MATURITY_MODELS.Add(new AVAILABLE_MATURITY_MODELS() { Assessment_Id = assessmentId, model_id = mm.Maturity_Model_Id, Selected = true }); } dbb.SaveChanges(); AssessmentUtil.TouchAssessment(assessmentId); }
/// <summary> /// Saves the selected maturity model. /// </summary> /// <param name="selectedMaturityModels"></param> /// <returns></returns> public void PersistSelectedMaturityModel(int assessmentId, string selectedModelName) { using (var db = new CSET_Context()) { var result = db.AVAILABLE_MATURITY_MODELS.Where(x => x.Assessment_Id == assessmentId); db.AVAILABLE_MATURITY_MODELS.RemoveRange(result); var mm = db.MATURITY_MODELS.Where(x => x.Model_Name == selectedModelName).FirstOrDefault(); if (mm != null) { db.AVAILABLE_MATURITY_MODELS.Add(new AVAILABLE_MATURITY_MODELS() { Assessment_Id = assessmentId, model_id = mm.Maturity_Model_Id, Selected = true }); db.SaveChanges(); } } AssessmentUtil.TouchAssessment(assessmentId); }
/// <summary> /// Persists data to the ASSESSMENTS and INFORMATION tables. /// Date fields should be converted to UTC before sending the Assessment /// to this method. /// </summary> /// <param name="assessment"></param> /// <returns></returns> public int SaveAssessmentDetail(int assessmentId, AssessmentDetail assessment) { using (var db = new DataLayerCore.Model.CSET_Context()) { TokenManager tm = new TokenManager(); string app_code = tm.Payload(Constants.Token_Scope); // Add or update the ASSESSMENTS record var dbAssessment = db.ASSESSMENTS.Where(x => x.Assessment_Id == assessmentId).FirstOrDefault(); if (dbAssessment == null) { dbAssessment = new ASSESSMENTS(); db.ASSESSMENTS.Add(dbAssessment); db.SaveChanges(); assessmentId = dbAssessment.Assessment_Id; } dbAssessment.Assessment_Id = assessmentId; dbAssessment.AssessmentCreatedDate = assessment.CreatedDate; dbAssessment.AssessmentCreatorId = assessment.CreatorId; dbAssessment.Assessment_Date = assessment.AssessmentDate ?? DateTime.Now; dbAssessment.LastAccessedDate = assessment.LastModifiedDate; dbAssessment.Charter = string.IsNullOrEmpty(assessment.Charter) ? string.Empty : assessment.Charter.PadLeft(5, '0'); dbAssessment.CreditUnionName = assessment.CreditUnion; dbAssessment.Assets = assessment.Assets; dbAssessment.MatDetail_targetBandOnly = (app_code == "ACET"); dbAssessment.AnalyzeDiagram = false; db.ASSESSMENTS.AddOrUpdate(dbAssessment, x => x.Assessment_Id); db.SaveChanges(); var user = db.USERS.FirstOrDefault(x => x.UserId == dbAssessment.AssessmentCreatorId); var dbInformation = db.INFORMATION.Where(x => x.Id == assessmentId).FirstOrDefault(); if (dbInformation == null) { dbInformation = new INFORMATION() { Id = assessmentId }; } // add or update the INFORMATION record dbInformation.Assessment_Name = assessment.AssessmentName; dbInformation.Facility_Name = assessment.FacilityName; dbInformation.City_Or_Site_Name = assessment.CityOrSiteName; dbInformation.State_Province_Or_Region = assessment.StateProvRegion; dbInformation.Executive_Summary = assessment.ExecutiveSummary; dbInformation.Assessment_Description = assessment.AssessmentDescription; dbInformation.Additional_Notes_And_Comments = assessment.AdditionalNotesAndComments; dbInformation.IsAcetOnly = assessment.IsAcetOnly; db.INFORMATION.AddOrUpdate(dbInformation, x => x.Id); db.SaveChanges(); AssessmentUtil.TouchAssessment(assessmentId); return(assessmentId); } }
/// <summary> /// Saves a new text value override in a PARAMETER_VALUES row. /// Creates a new Answer if need be. /// If no text is provided, any PARAMETER_VALUES is deleted. /// </summary> /// <param name="requirementId"></param> /// <param name="parameterId"></param> /// <param name="answerId"></param> /// <param name="newText"></param> /// <returns></returns> public ParameterToken SaveAnswerParameter(int requirementId, int parameterId, int answerId, string newText) { // create an answer if there isn't one already if (answerId == 0) { Answer ans = new Answer() { QuestionId = requirementId, Is_Requirement = true, MarkForReview = false, QuestionNumber = 0, AnswerText = "U" }; answerId = StoreAnswer(ans); } using (var db = new CSET_Context()) { // If an empty value is supplied, delete the PARAMETER_VALUES row. if (string.IsNullOrEmpty(newText)) { var g = db.PARAMETER_VALUES.Where(pv => pv.Parameter_Id == parameterId && pv.Answer_Id == answerId).FirstOrDefault(); if (g != null) { db.PARAMETER_VALUES.Remove(g); db.SaveChanges(); } AssessmentUtil.TouchAssessment(_assessmentId); return(this.GetTokensForRequirement(requirementId, answerId).Where(p => p.Id == parameterId).First()); } // Otherwise, add or update the PARAMETER_VALUES row var dbParameterValues = db.PARAMETER_VALUES.Where(pv => pv.Parameter_Id == parameterId && pv.Answer_Id == answerId).FirstOrDefault(); if (dbParameterValues == null) { dbParameterValues = new PARAMETER_VALUES(); } dbParameterValues.Answer_Id = answerId; dbParameterValues.Parameter_Id = parameterId; dbParameterValues.Parameter_Is_Default = false; dbParameterValues.Parameter_Value = newText; if (db.PARAMETER_VALUES.Find(dbParameterValues.Answer_Id, dbParameterValues.Parameter_Id) == null) { db.PARAMETER_VALUES.Add(dbParameterValues); } else { db.PARAMETER_VALUES.Update(dbParameterValues); } db.SaveChanges(); AssessmentUtil.TouchAssessment(_assessmentId); // Return the token that was just updated return(this.GetTokensForRequirement(requirementId, answerId).Where(p => p.Id == parameterId).First()); } }
/// <summary> /// Persists data to the ASSESSMENTS and INFORMATION tables. /// Date fields should be converted to UTC before sending the Assessment /// to this method. /// </summary> /// <param name="assessment"></param> /// <returns></returns> public int SaveAssessmentDetail(int assessmentId, AssessmentDetail assessment) { using (var db = new DataLayerCore.Model.CSET_Context()) { TokenManager tm = new TokenManager(); string app_code = tm.Payload(Constants.Token_Scope); // Add or update the ASSESSMENTS record var dbAssessment = db.ASSESSMENTS.Where(x => x.Assessment_Id == assessmentId).FirstOrDefault(); if (dbAssessment == null) { dbAssessment = new ASSESSMENTS(); db.ASSESSMENTS.Add(dbAssessment); db.SaveChanges(); assessmentId = dbAssessment.Assessment_Id; } dbAssessment.Assessment_Id = assessmentId; dbAssessment.AssessmentCreatedDate = assessment.CreatedDate; dbAssessment.AssessmentCreatorId = assessment.CreatorId; dbAssessment.Assessment_Date = assessment.AssessmentDate ?? DateTime.Now; dbAssessment.LastAccessedDate = assessment.LastModifiedDate; dbAssessment.UseDiagram = assessment.UseDiagram; dbAssessment.UseMaturity = assessment.UseMaturity; dbAssessment.UseStandard = assessment.UseStandard; dbAssessment.Charter = string.IsNullOrEmpty(assessment.Charter) ? string.Empty : assessment.Charter.PadLeft(5, '0'); dbAssessment.CreditUnionName = assessment.CreditUnion; dbAssessment.Assets = assessment.Assets; dbAssessment.MatDetail_targetBandOnly = (app_code == "ACET"); dbAssessment.Diagram_Markup = assessment.DiagramMarkup; dbAssessment.Diagram_Image = assessment.DiagramImage; dbAssessment.AnalyzeDiagram = false; db.ASSESSMENTS.AddOrUpdate(dbAssessment, x => x.Assessment_Id); db.SaveChanges(); var user = db.USERS.FirstOrDefault(x => x.UserId == dbAssessment.AssessmentCreatorId); var dbInformation = db.INFORMATION.Where(x => x.Id == assessmentId).FirstOrDefault(); if (dbInformation == null) { dbInformation = new INFORMATION() { Id = assessmentId }; } // add or update the INFORMATION record dbInformation.Assessment_Name = assessment.AssessmentName; dbInformation.Facility_Name = assessment.FacilityName; dbInformation.City_Or_Site_Name = assessment.CityOrSiteName; dbInformation.State_Province_Or_Region = assessment.StateProvRegion; dbInformation.Executive_Summary = assessment.ExecutiveSummary; dbInformation.Assessment_Description = assessment.AssessmentDescription; dbInformation.Additional_Notes_And_Comments = assessment.AdditionalNotesAndComments; dbInformation.IsAcetOnly = assessment.IsAcetOnly; db.INFORMATION.AddOrUpdate(dbInformation, x => x.Id); db.SaveChanges(); if (assessment.UseMaturity) { SalManager salManager = new SalManager(); salManager.SetDefaultSAL_IfNotSet(assessmentId); //this is at the bottom deliberatly because //we want everything else to succeed first MaturityManager mm = new MaturityManager(); mm.PersistSelectedMaturityModel(assessmentId, "CMMC"); if (mm.GetMaturityLevel(assessmentId) == 0) { mm.PersistMaturityLevel(assessmentId, 1); } } AssessmentUtil.TouchAssessment(assessmentId); return(assessmentId); } }
/// <summary> /// Creates or updates the rows necessary to attach a Contact to an Assessment. /// Creates a new User based on email. /// Creates or overwrites the ASSESSMENT_CONTACTS connection. /// Creates a new Contact if needed. If a Contact already exists for the email, no /// changes are made to the Contact row. /// </summary> public ContactDetail CreateAndAddContactToAssessment(ContactCreateParameters newContact) { int assessmentId = Auth.AssessmentForUser(); TokenManager tm = new TokenManager(); string app_code = tm.Payload(Constants.Token_Scope); NotificationManager nm = new NotificationManager(); ASSESSMENT_CONTACTS existingContact = null; using (var db = new CSET_Context()) { // See if the Contact already exists existingContact = db.ASSESSMENT_CONTACTS.Where(x => x.UserId == newContact.UserId && x.Assessment_Id == assessmentId).FirstOrDefault(); if (existingContact == null) { // Create Contact var c = new ASSESSMENT_CONTACTS() { FirstName = newContact.FirstName, LastName = newContact.LastName, PrimaryEmail = newContact.PrimaryEmail, Assessment_Id = assessmentId, AssessmentRoleId = newContact.AssessmentRoleId, Title = newContact.Title, Phone = newContact.Phone }; // Include the userid if such a user exists USERS user = db.USERS.Where(u => !string.IsNullOrEmpty(u.PrimaryEmail) && u.PrimaryEmail == newContact.PrimaryEmail) .FirstOrDefault(); if (user != null) { c.UserId = user.UserId; } db.ASSESSMENT_CONTACTS.AddOrUpdate(c, x => x.Assessment_Contact_Id); // If there was no USER record for this new Contact, create one if (user == null) { UserDetail userDetail = new UserDetail { Email = newContact.PrimaryEmail, FirstName = newContact.FirstName, LastName = newContact.LastName, IsSuperUser = false, PasswordResetRequired = true }; UserManager um = new UserManager(); UserCreateResponse resp = um.CheckUserExists(userDetail); if (!resp.IsExisting) { resp = um.CreateUser(userDetail); // Send this brand-new user an email with their temporary password (if they have an email) if (!string.IsNullOrEmpty(userDetail.Email)) { if (!UserAuthentication.IsLocalInstallation(app_code)) { nm.SendInviteePassword(userDetail.Email, userDetail.FirstName, userDetail.LastName, resp.TemporaryPassword); } } } c.UserId = resp.UserId; } db.SaveChanges(); AssessmentUtil.TouchAssessment(assessmentId); existingContact = c; } } // Flip the 'invite' flag to true, if they are a contact on the current Assessment ContactsManager cm = new ContactsManager(); cm.MarkContactInvited(newContact.UserId, assessmentId); // Tell the user that they have been invited to participate in an Assessment (if they have an email) if (!string.IsNullOrEmpty(newContact.PrimaryEmail)) { if (!UserAuthentication.IsLocalInstallation(app_code)) { nm.InviteToAssessment(newContact); } } // Return the full list of Contacts for the Assessment return(new ContactDetail { FirstName = existingContact.FirstName, LastName = existingContact.LastName, PrimaryEmail = existingContact.PrimaryEmail, AssessmentId = existingContact.Assessment_Id, AssessmentRoleId = existingContact.AssessmentRoleId, Invited = existingContact.Invited, UserId = existingContact.UserId ?? null, Title = existingContact.Title, Phone = existingContact.Phone }); }