Beispiel #1
0
        /// <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));
            }
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #4
0
        /// <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);
        }
Beispiel #5
0
        /// <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);
        }
Beispiel #6
0
        /// <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);
            }
        }
Beispiel #7
0
        /// <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));
            }
        }
Beispiel #8
0
        /// <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);
        }
Beispiel #10
0
        /// <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);
        }
Beispiel #11
0
        /// <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);
        }
Beispiel #12
0
        /// <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);
        }
Beispiel #13
0
        /// <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);
        }
Beispiel #14
0
        /// <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
                });
            }
        }
Beispiel #15
0
        /// <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);
            }
        }
Beispiel #16
0
        /// <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);
        }
Beispiel #17
0
        /// <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);
        }
Beispiel #18
0
        /// <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);
            }
        }
Beispiel #19
0
        /// <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());
            }
        }
Beispiel #20
0
        /// <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);
            }
        }
Beispiel #21
0
        /// <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
            });
        }