Пример #1
0
        public static async Task <ConverterResult <NEW_REQUIREMENT> > ToRequirement(this IExternalRequirement externalRequirement, string setName, ILogger logger)
        {
            var result         = new ConverterResult <NEW_REQUIREMENT>(logger);
            var newRequirement = result.Result;

            //basic mappings
            newRequirement.Supplemental_Info      = externalRequirement.Supplemental;
            newRequirement.Requirement_Text       = externalRequirement.Text;
            newRequirement.Requirement_Title      = externalRequirement.Identifier;
            newRequirement.Original_Set_Name      = setName;
            newRequirement.Weight                 = externalRequirement.Weight;
            newRequirement.REQUIREMENT_LEVELS     = new List <REQUIREMENT_LEVELS>();
            newRequirement.REQUIREMENT_REFERENCES = new List <REQUIREMENT_REFERENCES>();
            newRequirement.REQUIREMENT_SETS       = new List <REQUIREMENT_SETS>()
            {
                new REQUIREMENT_SETS()
                {
                    Set_Name = setName
                }
            };
            //newRequirement.NEW_QUESTION = new List<NEW_QUESTION>();

            QUESTION_GROUP_HEADING          questionGroupHeading = null;
            UNIVERSAL_SUB_CATEGORY_HEADINGS subcategory          = null;

            using (var db = new CSET_Context())
            {
                try
                {
                    questionGroupHeading = db.QUESTION_GROUP_HEADING.FirstOrDefault(s => s.Question_Group_Heading1.Trim().ToLower() == externalRequirement.Heading.Trim().ToLower());
                    try
                    {
                        var subcatId = db.UNIVERSAL_SUB_CATEGORIES.FirstOrDefault(s => s.Universal_Sub_Category.Trim().ToLower() == externalRequirement.Subheading.Trim().ToLower())?.Universal_Sub_Category_Id ?? 0;
                        if (subcatId == 0)
                        {
                            var subcat = new UNIVERSAL_SUB_CATEGORIES()
                            {
                                Universal_Sub_Category = externalRequirement.Subheading
                            };
                            db.UNIVERSAL_SUB_CATEGORIES.Add(subcat);
                            await db.SaveChangesAsync();

                            subcatId = subcat.Universal_Sub_Category_Id;
                        }
                        try
                        {
                            subcategory = db.UNIVERSAL_SUB_CATEGORY_HEADINGS.FirstOrDefault(s => (s.Universal_Sub_Category_Id == subcatId) && (s.Question_Group_Heading_Id == questionGroupHeading.Question_Group_Heading_Id));
                            if (subcategory == null)
                            {
                                subcategory = new UNIVERSAL_SUB_CATEGORY_HEADINGS()
                                {
                                    Universal_Sub_Category_Id = subcatId, Question_Group_Heading_Id = questionGroupHeading.Question_Group_Heading_Id
                                };
                                db.UNIVERSAL_SUB_CATEGORY_HEADINGS.Add(subcategory);
                                await db.SaveChangesAsync();
                            }
                        }
                        catch
                        {
                        }
                    }
                    catch
                    {
                    }
                }
                catch
                {
                }
            }
            if (questionGroupHeading == null)
            {
                result.LogError(String.Format("Heading invalid for requirement {0} {1}.  Please double check that the heading is spelled correctly.", externalRequirement.Identifier, externalRequirement.Text));
            }
            else
            {
                newRequirement.Question_Group_Heading_Id = questionGroupHeading.Question_Group_Heading_Id;
            }

            if (subcategory == null)
            {
                result.LogError(String.Format("Subheading invalid for requirement {0} {1}.  Please double check that the heading is spelled correctly.", externalRequirement.Identifier, externalRequirement.Text));
            }
            externalRequirement.Category = string.IsNullOrWhiteSpace(externalRequirement.Category) ? externalRequirement.Heading : externalRequirement.Category;
            using (var db = new CSET_Context())
            {
                var category = db.STANDARD_CATEGORY.FirstOrDefault(s => s.Standard_Category1 == externalRequirement.Category);
                if (category == null)
                {
                    newRequirement.Standard_CategoryNavigation = new STANDARD_CATEGORY()
                    {
                        Standard_Category1 = externalRequirement.Category
                    };
                }
                else
                {
                    newRequirement.Standard_Category = category.Standard_Category1;
                }
            }
            foreach (var sal in Enum.GetValues(typeof(SalValues)).Cast <SalValues>().ToList())
            {
                try
                {
                    if ((int)sal >= (externalRequirement.SecurityAssuranceLevel ?? 0))
                    {
                        var rl = new REQUIREMENT_LEVELS()
                        {
                            Standard_Level = sal.ToString(),
                            Level_Type     = "NST"
                        };
                        newRequirement.REQUIREMENT_LEVELS.Add(rl);
                    }
                }
                catch
                {
                    result.LogError(String.Format("An error occurred while adding SALs for requirement {0} {1}.", externalRequirement.Identifier, externalRequirement.Text));
                }
            }
            var importer = new DocumentImporter();

            if (externalRequirement.References != null)
            {
                foreach (var reference in externalRequirement.References)
                {
                    var reqReference = new REQUIREMENT_REFERENCES();
                    try
                    {
                        reqReference.Destination_String = reference.Destination;
                        reqReference.Page_Number        = reference.PageNumber;
                        reqReference.Section_Ref        = String.IsNullOrEmpty(reference.SectionReference) ? "" : reference.SectionReference;
                        reqReference.Gen_File_Id        = importer.LookupGenFileId(reference.FileName);
                    }
                    catch
                    {
                        result.LogError(String.Format("Reference {0} could not be added for requirement {1} {2}.", externalRequirement.Source?.FileName, externalRequirement.Identifier, externalRequirement.Text));
                    }
                    if (reqReference.Gen_File_Id == 0)
                    {
                        result.LogError(String.Format("Reference {0} has not been loaded into CSET.  Please add the file and try again.", externalRequirement.Source?.FileName, externalRequirement.Identifier, externalRequirement.Text));
                    }
                    else
                    {
                        newRequirement.REQUIREMENT_REFERENCES.Add(reqReference);
                    }
                }
            }
            var reqSource = new REQUIREMENT_SOURCE_FILES();

            try
            {
                if (externalRequirement.Source != null)
                {
                    reqSource.Gen_File_Id        = importer.LookupGenFileId(externalRequirement.Source.FileName);
                    reqSource.Page_Number        = externalRequirement.Source.PageNumber;
                    reqSource.Destination_String = externalRequirement.Source.Destination;
                    reqSource.Section_Ref        = String.IsNullOrEmpty(externalRequirement.Source.SectionReference) ? "" : externalRequirement.Source.SectionReference;
                    if (reqSource.Gen_File_Id == 0)
                    {
                        result.LogError(String.Format("Source {0} has not been loaded into CSET.  Please add the file and try again.", externalRequirement.Source?.FileName, externalRequirement.Identifier, externalRequirement.Text));
                    }
                    else
                    {
                        newRequirement.REQUIREMENT_SOURCE_FILES.Add(reqSource);
                    }
                }
            }
            catch
            {
                result.LogError(String.Format("Source {0} could not be added for requirement {1} {2}.", externalRequirement.Source?.FileName, externalRequirement.Identifier, externalRequirement.Text));
            }
            if (externalRequirement.Questions == null || externalRequirement.Questions.Count() == 0)
            {
                externalRequirement.Questions = new QuestionList()
                {
                    externalRequirement.Text
                };
            }
            foreach (var question in externalRequirement.Questions)
            {
                NEW_QUESTION newQuestion = null;
                var          set         = new NEW_QUESTION_SETS()
                {
                    Set_Name = setName, NEW_QUESTION_LEVELS = new List <NEW_QUESTION_LEVELS>()
                };
                using (var db = new CSET_Context())
                {
                    newQuestion = db.NEW_QUESTION.FirstOrDefault(s => s.Simple_Question.ToLower().Trim() == question.ToLower().Trim());
                    if (newQuestion != null)
                    {
                        db.Entry(newQuestion).State = EntityState.Detached;
                    }
                }
                if (newQuestion == null)
                {
                    newQuestion = new NEW_QUESTION();
                    try
                    {
                        newQuestion.Original_Set_Name   = setName;
                        newQuestion.Simple_Question     = question;
                        newQuestion.Weight              = externalRequirement.Weight;
                        newQuestion.Question_Group_Id   = questionGroupHeading.Question_Group_Heading_Id;
                        newQuestion.Universal_Sal_Level = ((SalValues)(externalRequirement.SecurityAssuranceLevel ?? (int)SalValues.L)).ToString();
                        newQuestion.Std_Ref             = setName.Replace("_", "");
                        newQuestion.Std_Ref             = newQuestion.Std_Ref.Substring(0, Math.Min(newQuestion.Std_Ref.Length, 50));
                        newQuestion.Heading_Pair_Id     = subcategory.Heading_Pair_Id;
                    }
                    catch
                    {
                        result.LogError(String.Format("Question {0} could not be added for requirement {1} {2}.", question, externalRequirement.Identifier, externalRequirement.Text));
                    }
                }
                foreach (var sal in Enum.GetValues(typeof(SalValues)).Cast <SalValues>().ToList())
                {
                    try
                    {
                        if ((int)sal >= (externalRequirement.SecurityAssuranceLevel ?? 0))
                        {
                            var rl = new NEW_QUESTION_LEVELS()
                            {
                                Universal_Sal_Level = sal.ToString(),
                            };
                            set.NEW_QUESTION_LEVELS.Add(rl);
                        }
                    }
                    catch
                    {
                        result.LogError(String.Format("An error occurred while adding SALs for requirement {1} {2}.", externalRequirement.Source?.FileName, externalRequirement.Identifier, externalRequirement.Text));
                    }
                }
                newQuestion.NEW_QUESTION_SETS          = new List <NEW_QUESTION_SETS>();
                newQuestion.REQUIREMENT_QUESTIONS_SETS = new List <REQUIREMENT_QUESTIONS_SETS>();
                newQuestion.NEW_QUESTION_SETS.Add(set);
                newQuestion.REQUIREMENT_QUESTIONS_SETS.Add(new REQUIREMENT_QUESTIONS_SETS {
                    Set_Name = setName, Requirement_ = newRequirement
                });
                using (CSET_Context db = new CSET_Context())
                {
                    db.NEW_QUESTION.Add(newQuestion);
                }
            }
            return(result);
        }
Пример #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="externalRequirement"></param>
        /// <param name="setName"></param>
        /// <param name="logger"></param>
        /// <returns></returns>
        public static NEW_REQUIREMENT SaveRequirement(this IExternalRequirement externalRequirement, string setName,
                                                      int sequence, ILogger logger)
        {
            var result         = new ConverterResult <NEW_REQUIREMENT>(logger);
            var newRequirement = result.Result;

            //basic mappings
            newRequirement.Supplemental_Info      = externalRequirement.Supplemental;
            newRequirement.Requirement_Text       = externalRequirement.Text;
            newRequirement.Requirement_Title      = externalRequirement.Identifier;
            newRequirement.Original_Set_Name      = setName;
            newRequirement.Weight                 = externalRequirement.Weight;
            newRequirement.REQUIREMENT_LEVELS     = new List <REQUIREMENT_LEVELS>();
            newRequirement.REQUIREMENT_REFERENCES = new List <REQUIREMENT_REFERENCES>();
            newRequirement.REQUIREMENT_SETS       = new List <REQUIREMENT_SETS>()
            {
                new REQUIREMENT_SETS()
                {
                    Set_Name             = setName,
                    Requirement_Sequence = sequence
                }
            };

            QUESTION_GROUP_HEADING          questionGroupHeading = null;
            UNIVERSAL_SUB_CATEGORY_HEADINGS uschPairing          = null;

            var db = new CSET_Context();

            try
            {
                questionGroupHeading = db.QUESTION_GROUP_HEADING.FirstOrDefault(s => s.Question_Group_Heading1.Trim().ToLower() == externalRequirement.Heading.Trim().ToLower());
                try
                {
                    var subcatId = db.UNIVERSAL_SUB_CATEGORIES.FirstOrDefault(s => s.Universal_Sub_Category.Trim().ToLower() == externalRequirement.Subheading.Trim().ToLower())?.Universal_Sub_Category_Id ?? 0;
                    if (subcatId == 0)
                    {
                        var subcat = new UNIVERSAL_SUB_CATEGORIES()
                        {
                            Universal_Sub_Category = externalRequirement.Subheading
                        };
                        db.UNIVERSAL_SUB_CATEGORIES.Add(subcat);
                        db.SaveChanges();
                        subcatId = subcat.Universal_Sub_Category_Id;
                    }

                    try
                    {
                        uschPairing = db.UNIVERSAL_SUB_CATEGORY_HEADINGS.FirstOrDefault(s => (s.Universal_Sub_Category_Id == subcatId) && (s.Question_Group_Heading_Id == questionGroupHeading.Question_Group_Heading_Id));
                        if (uschPairing == null)
                        {
                            uschPairing = new UNIVERSAL_SUB_CATEGORY_HEADINGS()
                            {
                                Set_Name = "Standards",
                                Universal_Sub_Category_Id = subcatId,
                                Question_Group_Heading_Id = questionGroupHeading.Question_Group_Heading_Id
                            };
                            db.UNIVERSAL_SUB_CATEGORY_HEADINGS.Add(uschPairing);
                            db.SaveChanges();
                        }
                    }
                    catch (Exception exc)
                    {
                        var myExc = exc;
                    }
                }
                catch
                {
                }
            }
            catch
            {
            }


            if (questionGroupHeading == null)
            {
                result.LogError(String.Format("Heading invalid for requirement {0} {1}.  Please double check that the heading is spelled correctly.", externalRequirement.Identifier, externalRequirement.Text));
            }
            else
            {
                newRequirement.Question_Group_Heading_Id = questionGroupHeading.Question_Group_Heading_Id;
            }


            if (uschPairing == null)
            {
                result.LogError(String.Format("Subheading invalid for requirement {0} {1}.  Please double check that the heading is spelled correctly.", externalRequirement.Identifier, externalRequirement.Text));
            }

            externalRequirement.Category = string.IsNullOrWhiteSpace(externalRequirement.Category) ? externalRequirement.Heading : externalRequirement.Category;
            var category = db.STANDARD_CATEGORY.FirstOrDefault(s => s.Standard_Category1 == externalRequirement.Category);

            if (category == null)
            {
                newRequirement.Standard_CategoryNavigation = new STANDARD_CATEGORY()
                {
                    Standard_Category1 = externalRequirement.Category
                };
            }
            else
            {
                newRequirement.Standard_Category = category.Standard_Category1;
            }

            newRequirement.Standard_Sub_Category = externalRequirement.Subheading;


            // SAL
            foreach (string sal in externalRequirement.SecurityAssuranceLevels)
            {
                var rl = new REQUIREMENT_LEVELS()
                {
                    Standard_Level = sal,
                    Level_Type     = "NST"
                };

                if (newRequirement.REQUIREMENT_LEVELS.Count(x => x.Standard_Level == rl.Standard_Level) == 0)
                {
                    newRequirement.REQUIREMENT_LEVELS.Add(rl);
                }
            }


            var importer = new DocumentImporter();

            if (externalRequirement.References != null)
            {
                foreach (var reference in externalRequirement.References)
                {
                    var reqReference = new REQUIREMENT_REFERENCES();
                    try
                    {
                        reqReference.Destination_String = reference.Destination;
                        reqReference.Page_Number        = reference.PageNumber;
                        reqReference.Section_Ref        = String.IsNullOrEmpty(reference.SectionReference) ? "" : reference.SectionReference;
                        reqReference.Gen_File_Id        = importer.LookupGenFileId(reference.FileName);
                    }
                    catch
                    {
                        result.LogError(String.Format("Reference {0} could not be added for requirement {1} {2}.", externalRequirement.Source?.FileName, externalRequirement.Identifier, externalRequirement.Text));
                    }
                    if (reqReference.Gen_File_Id == 0)
                    {
                        result.LogError(String.Format("Reference {0} has not been loaded into CSET.  Please add the file and try again.", externalRequirement.Source?.FileName, externalRequirement.Identifier, externalRequirement.Text));
                    }
                    else
                    {
                        newRequirement.REQUIREMENT_REFERENCES.Add(reqReference);
                    }
                }
            }

            var reqSource = new REQUIREMENT_SOURCE_FILES();

            try
            {
                if (externalRequirement.Source != null)
                {
                    reqSource.Gen_File_Id        = importer.LookupGenFileId(externalRequirement.Source.FileName);
                    reqSource.Page_Number        = externalRequirement.Source.PageNumber;
                    reqSource.Destination_String = externalRequirement.Source.Destination;
                    reqSource.Section_Ref        = String.IsNullOrEmpty(externalRequirement.Source.SectionReference) ? "" : externalRequirement.Source.SectionReference;
                    if (reqSource.Gen_File_Id == 0)
                    {
                        result.LogError(String.Format("Source {0} has not been loaded into CSET.  Please add the file and try again.", externalRequirement.Source?.FileName, externalRequirement.Identifier, externalRequirement.Text));
                    }
                    else
                    {
                        newRequirement.REQUIREMENT_SOURCE_FILES.Add(reqSource);
                    }
                }
            }
            catch
            {
                result.LogError(String.Format("Source {0} could not be added for requirement {1} {2}.", externalRequirement.Source?.FileName, externalRequirement.Identifier, externalRequirement.Text));
            }

            try
            {
                db.NEW_REQUIREMENT.Add(newRequirement);
                db.SaveChanges();
            }
            catch (Exception exc)
            {
                // throw exc;
            }


            // Save any Questions associated with the Requirement
            SaveQuestions(setName, externalRequirement, newRequirement,
                          questionGroupHeading, uschPairing,
                          db);


            return(newRequirement);
        }
Пример #3
0
        /// <summary>
        ///
        /// </summary>
        public static void SaveQuestions(
            string setName,
            IExternalRequirement externalRequirement,
            NEW_REQUIREMENT newRequirement,
            QUESTION_GROUP_HEADING questionGroupHeading,
            UNIVERSAL_SUB_CATEGORY_HEADINGS uschPairing,
            CSET_Context db)
        {
            if (externalRequirement.Questions == null || externalRequirement.Questions.Count() == 0)
            {
                return;

                // trying to manufacture a question where none was defined could get us into trouble
                // externalRequirement.Questions = new QuestionList() { externalRequirement.Text };
            }

            var stdRefNum = 1;

            foreach (var question in externalRequirement.Questions)
            {
                NEW_QUESTION newQuestion = null;


                // Look for existing question by question text
                newQuestion = db.NEW_QUESTION.FirstOrDefault(s => s.Simple_Question.ToLower().Trim() == question.ToLower().Trim());

                if (newQuestion == null)
                {
                    newQuestion = new NEW_QUESTION();
                    try
                    {
                        newQuestion.Original_Set_Name   = setName;
                        newQuestion.Simple_Question     = question;
                        newQuestion.Weight              = externalRequirement.Weight;
                        newQuestion.Question_Group_Id   = questionGroupHeading.Question_Group_Heading_Id;
                        newQuestion.Universal_Sal_Level = SalCompare.FindLowestSal(externalRequirement.SecurityAssuranceLevels);
                        newQuestion.Std_Ref             = setName.Replace("_", "");
                        newQuestion.Std_Ref             = newQuestion.Std_Ref.Substring(0, Math.Min(newQuestion.Std_Ref.Length, 50));
                        newQuestion.Std_Ref_Number      = stdRefNum++;

                        newQuestion.Heading_Pair_Id = uschPairing.Heading_Pair_Id;

                        db.NEW_QUESTION.Add(newQuestion);
                        db.SaveChanges();
                    }
                    catch (Exception exc)
                    {
                        var a = exc;
                        // result.LogError(String.Format("Question {0} could not be added for requirement {1} {2}.", question, externalRequirement.Identifier, externalRequirement.Text));
                    }
                }


                var nqs = new NEW_QUESTION_SETS()
                {
                    Question_Id = newQuestion.Question_Id,
                    Set_Name    = setName
                };

                if (db.NEW_QUESTION_SETS.Count(x => x.Question_Id == nqs.Question_Id && x.Set_Name == nqs.Set_Name) == 0)
                {
                    db.NEW_QUESTION_SETS.Add(nqs);
                    db.SaveChanges();


                    // attach question SAL levels
                    var nqlList = new List <NEW_QUESTION_LEVELS>();
                    foreach (string sal in externalRequirement.SecurityAssuranceLevels)
                    {
                        var nql = new NEW_QUESTION_LEVELS()
                        {
                            Universal_Sal_Level = sal.ToString(),
                            New_Question_Set_Id = nqs.New_Question_Set_Id
                        };

                        if (!nqlList.Exists(x =>
                                            x.Universal_Sal_Level == nql.Universal_Sal_Level &&
                                            x.New_Question_Set_Id == nqs.New_Question_Set_Id))
                        {
                            db.NEW_QUESTION_LEVELS.Add(nql);
                            nqlList.Add(nql);
                        }
                    }
                }


                try
                {
                    var rqs = new REQUIREMENT_QUESTIONS_SETS()
                    {
                        Question_Id    = newQuestion.Question_Id,
                        Set_Name       = setName,
                        Requirement_Id = newRequirement.Requirement_Id
                    };
                    if (db.REQUIREMENT_QUESTIONS_SETS.Count(x =>
                                                            x.Question_Id == rqs.Question_Id &&
                                                            x.Set_Name == rqs.Set_Name) == 0)
                    {
                        db.REQUIREMENT_QUESTIONS_SETS.Add(rqs);
                    }


                    var rq = new REQUIREMENT_QUESTIONS()
                    {
                        Question_Id    = newQuestion.Question_Id,
                        Requirement_Id = newRequirement.Requirement_Id
                    };
                    if (db.REQUIREMENT_QUESTIONS_SETS.Count(x => x.Question_Id == rq.Question_Id &&
                                                            x.Requirement_Id == rq.Requirement_Id) == 0)
                    {
                        db.REQUIREMENT_QUESTIONS.Add(rq);
                    }

                    db.SaveChanges();
                }
                catch (Exception exc)
                {
                    throw new Exception("Error saving REQUIREMENT_QUESTIONS_SETS and REQUIREMENT_QUESTIONS");
                }
            }
        }
Пример #4
0
        public Tuple <int, Dictionary <int, DOCUMENT_FILE> > RunImport(UploadAssessmentModel model,
                                                                       int currentUserId, string primaryEmail
                                                                       , CSET_Context db)
        {
            //create the new assessment
            //copy each of the items to the table
            //as the copy occurs change to the current assessment_id
            //update the answer id's
            Dictionary <int, DOCUMENT_FILE> oldIdToNewDocument = new Dictionary <int, DOCUMENT_FILE>();
            AssessmentManager man    = new AssessmentManager();
            AssessmentDetail  detail = man.CreateNewAssessmentForImport(currentUserId);
            int _assessmentId        = detail.Id;

            Dictionary <int, int>    oldAnswerId    = new Dictionary <int, int>();
            Dictionary <int, ANSWER> oldIdNewAnswer = new Dictionary <int, ANSWER>();

            Dictionary <String, int> oldUserNewUser = db.USERS.ToDictionary(x => x.PrimaryEmail, y => y.UserId);


            // go through the assessment contacts and
            // if the contact does exist create it then add the id
            // if the contact does exist update the id
            foreach (var a in model.jASSESSMENT_CONTACTS.Where(x => x.PrimaryEmail != primaryEmail))
            {
                var item = TinyMapper.Map <ASSESSMENT_CONTACTS>(a);
                item.Assessment_Id = _assessmentId;
                item.PrimaryEmail  = a.PrimaryEmail;
                int userid;
                if (oldUserNewUser.TryGetValue(a.PrimaryEmail, out userid))
                {
                    item.UserId = userid;
                }
                else
                {
                    item.UserId = null;
                }
                db.ASSESSMENT_CONTACTS.Add(item);
            }
            db.SaveChanges();


            foreach (var a in model.jUSER_DETAIL_INFORMATION)
            {
                if (db.USER_DETAIL_INFORMATION.Where(x => x.Id == a.Id).FirstOrDefault() == null)
                {
                    var userInfo = TinyMapper.Map <USER_DETAIL_INFORMATION>(a);
                    userInfo.FirstName = String.IsNullOrWhiteSpace(a.FirstName) ? "First Name" : a.FirstName;
                    userInfo.LastName  = String.IsNullOrWhiteSpace(a.LastName) ? "Last Name" : a.LastName;
                    db.USER_DETAIL_INFORMATION.Add(userInfo);
                    foreach (var b in a.jADDRESSes)
                    {
                        var item = TinyMapper.Map <ADDRESS>(b);
                        item.AddressType = "Imported";
                        db.ADDRESS.Add(item);
                    }
                    db.SaveChanges();
                }
            }

            foreach (var a in model.jANSWER)
            {
                a.Assessment_Id = _assessmentId;
                a.Old_Answer_Id = a.Answer_Id;
                a.Answer_Id     = 0;
            }
            db.SaveChanges();
            var objBulk = new BulkUploadToSql <jANSWER>()
            {
                InternalStore    = model.jANSWER,
                TableName        = "ANSWER",
                CommitBatchSize  = 1000,
                ConnectionString = ((Microsoft.EntityFrameworkCore.DbContext)db).Database.GetDbConnection().ConnectionString
            };

            objBulk.Commit();


            oldAnswerId    = db.ANSWER.Where(x => x.Assessment_Id == _assessmentId).ToDictionary(x => x.Old_Answer_Id ?? 0, y => y.Answer_Id);
            oldIdNewAnswer = db.ANSWER.Where(x => x.Assessment_Id == _assessmentId).ToDictionary(x => x.Old_Answer_Id ?? 0, y => y);


            if (model.jSTANDARD_SELECTION.Count > 0)
            {
                foreach (var a in model.jSTANDARD_SELECTION)
                {
                    var item = TinyMapper.Map <STANDARD_SELECTION>(a);
                    item.Assessment_Id = _assessmentId;
                    db.STANDARD_SELECTION.Add(item);
                }
            }
            else
            {
                db.STANDARD_SELECTION.Add(new STANDARD_SELECTION()
                {
                    Application_Mode            = AssessmentModeData.QUESTIONS_BASED_APPLICATION_MODE,
                    Selected_Sal_Level          = Constants.SAL_LOW,
                    Assessment_Id               = _assessmentId,
                    Last_Sal_Determination_Type = Constants.SIMPLE_SAL,
                    Is_Advanced = false
                });
            }
            foreach (var a in model.jASSESSMENT_SELECTED_LEVELS)
            {
                var item = TinyMapper.Map <ASSESSMENT_SELECTED_LEVELS>(a);
                item.Assessment_Id = _assessmentId;
                db.ASSESSMENT_SELECTED_LEVELS.Add(item);
            }
            foreach (var a in model.jAVAILABLE_STANDARDS)
            {
                var item = TinyMapper.Map <AVAILABLE_STANDARDS>(a);
                item.Assessment_Id = _assessmentId;
                db.AVAILABLE_STANDARDS.Add(item);
            }
            foreach (var a in model.jCNSS_CIA_JUSTIFICATIONS)
            {
                var item = TinyMapper.Map <CNSS_CIA_JUSTIFICATIONS>(a);
                item.Assessment_Id = _assessmentId;
                db.CNSS_CIA_JUSTIFICATIONS.Add(item);
            }
            foreach (var a in model.jCUSTOM_BASE_STANDARDS)
            {
                var item = TinyMapper.Map <CUSTOM_BASE_STANDARDS>(a); db.CUSTOM_BASE_STANDARDS.Add(item);
            }
            foreach (var a in model.jCUSTOM_QUESTIONAIRES)
            {
                var item = TinyMapper.Map <CUSTOM_QUESTIONAIRES>(a); db.CUSTOM_QUESTIONAIRES.Add(item);
            }
            foreach (var a in model.jCUSTOM_QUESTIONAIRE_QUESTIONS)
            {
                var item = TinyMapper.Map <CUSTOM_QUESTIONAIRE_QUESTIONS>(a); db.CUSTOM_QUESTIONAIRE_QUESTIONS.Add(item);
            }
            foreach (var a in model.jCUSTOM_STANDARD_BASE_STANDARD)
            {
                var item = TinyMapper.Map <CUSTOM_STANDARD_BASE_STANDARD>(a); db.CUSTOM_STANDARD_BASE_STANDARD.Add(item);
            }
            foreach (var a in model.jDEMOGRAPHICS)
            {
                var item = TinyMapper.Map <DEMOGRAPHICS>(a);
                item.Assessment_Id = _assessmentId;
                if ((a.IndustryId == 0) || (a.SectorId == 0))
                {
                    //what do we want to do for a default?
                }
                else
                {
                    db.DEMOGRAPHICS.Add(item);
                }
            }
            //this needs the answers inserted first
            //then the documents and finally
            //we can associate documents and answers
            //look at adding a reference to the answer to jDocument_File
            //then as we iterate through the answers and documents keep the references
            foreach (var a in model.jDOCUMENT_FILE)
            {
                var item = TinyMapper.Map <DOCUMENT_FILE>(a);
                oldIdToNewDocument.Add(a.Document_Id, item);
                item.Assessment_Id = _assessmentId;
                item.Document_Id   = 0;
                db.DOCUMENT_FILE.Add(item);
            }
            db.SaveChanges();

            foreach (var a in model.jDOCUMENT_ANSWERS)
            {
                var item = oldIdToNewDocument[a.Document_Id];
                db.DOCUMENT_ANSWERS.Add(new DOCUMENT_ANSWERS()
                {
                    Answer_Id   = oldIdNewAnswer[a.Answer_Id].Answer_Id,
                    Document_Id = item.Document_Id
                });
            }

            Dictionary <int, FINDING> idToFinding = new Dictionary <int, FINDING>();

            foreach (var a in model.jFINDING)
            {
                var item = TinyMapper.Map <FINDING>(a);
                item.Importance_Id = item.Importance_Id == 0 ? 1 : item.Importance_Id;
                item.Answer_Id     = oldAnswerId[a.Answer_Id];
                idToFinding.Add(a.Finding_Id, item);
                db.FINDING.Add(item);
            }
            var AcontactID = db.ASSESSMENT_CONTACTS.Where(x => x.UserId == currentUserId).FirstOrDefault();

            if (AcontactID != null)//if we dont have a current user we are in trouble
            {
                int acid = AcontactID.Assessment_Contact_Id;
                foreach (var a in model.jFINDING_CONTACT)
                {
                    db.FINDING_CONTACT.Add(new FINDING_CONTACT()
                    {
                        Assessment_Contact_Id = a.Assessment_Contact_Id == 0 ? acid : a.Assessment_Contact_Id,
                        Finding_Id            = idToFinding[a.Finding_Id].Finding_Id,
                        Id = a.Old_Contact_Id
                    });
                }
            }


            foreach (var a in model.jFRAMEWORK_TIER_TYPE_ANSWER)
            {
                var item = TinyMapper.Map <FRAMEWORK_TIER_TYPE_ANSWER>(a);
                item.Assessment_Id = _assessmentId;
                db.FRAMEWORK_TIER_TYPE_ANSWER.Add(item);
            }
            foreach (var a in model.jGENERAL_SAL)
            {
                var item = TinyMapper.Map <GENERAL_SAL>(a);
                item.Assessment_Id = _assessmentId;
                db.GENERAL_SAL.Add(item);
            }
            foreach (var a in model.jINFORMATION)
            {
                var info = db.INFORMATION.Where(x => x.Id == _assessmentId).FirstOrDefault();
                if (info != null)
                {
                    TinyMapper.Map(a, info);
                    info.Id = _assessmentId;
                    db.SaveChanges();
                }
                else
                {
                    var item = TinyMapper.Map <INFORMATION>(a);
                    item.Id = _assessmentId;
                    db.INFORMATION.Add(item);
                }

                db.ASSESSMENTS.Where(x => x.Assessment_Id == _assessmentId).First().Assessment_Date = a.Assessment_Date;
                db.SaveChanges();
            }
            foreach (var a in model.jNIST_SAL_INFO_TYPES)
            {
                var item = TinyMapper.Map <NIST_SAL_INFO_TYPES>(a);
                item.Assessment_Id = _assessmentId;
                db.NIST_SAL_INFO_TYPES.Add(item);
            }
            foreach (var a in model.jNIST_SAL_QUESTION_ANSWERS)
            {
                var item = TinyMapper.Map <NIST_SAL_QUESTION_ANSWERS>(a);
                item.Question_Answer = item.Question_Answer ?? "No";
                item.Assessment_Id   = _assessmentId;
                db.NIST_SAL_QUESTION_ANSWERS.Add(item);
                db.SaveChanges();
            }
            foreach (var a in model.jPARAMETER_VALUES)
            {
                var item = TinyMapper.Map <PARAMETER_VALUES>(a);
                item.Answer_Id = oldAnswerId[a.Answer_Id];
                db.PARAMETER_VALUES.Add(item);
            }
            foreach (var a in model.jPARAMETER_ASSESSMENTs)
            {
                var item = TinyMapper.Map <PARAMETER_ASSESSMENT>(a);
                item.Assessment_ID = _assessmentId;
                db.PARAMETER_ASSESSMENT.Add(item);
            }

            foreach (var a in model.jSUB_CATEGORY_ANSWERS)
            {
                var item = TinyMapper.Map <SUB_CATEGORY_ANSWERS>(a);
                item.Assessement_Id = _assessmentId;

                if ((a.Question_Group_Heading_Id > 0) && (a.Universal_Sub_Category_Id > 0))
                {
                    var header = db.UNIVERSAL_SUB_CATEGORY_HEADINGS.Where(x => x.Question_Group_Heading_Id == a.Question_Group_Heading_Id && x.Universal_Sub_Category_Id == a.Universal_Sub_Category_Id).FirstOrDefault();
                    if (header != null)
                    {
                        item.Heading_Pair_Id = header.Heading_Pair_Id;
                    }
                    else
                    {
                        try
                        {
                            var tempHeading = db.UNIVERSAL_SUB_CATEGORIES.Where(x => x.Universal_Sub_Category_Id == a.Universal_Sub_Category_Id).FirstOrDefault();
                            if (tempHeading != null)
                            {
                                var adding = new UNIVERSAL_SUB_CATEGORY_HEADINGS()
                                {
                                    Display_Radio_Buttons            = false,
                                    Question_Group_Heading_Id        = a.Question_Group_Heading_Id,
                                    Universal_Sub_Category_Id        = a.Universal_Sub_Category_Id,
                                    Sub_Heading_Question_Description = null
                                };
                                //see if we can create the record
                                db.UNIVERSAL_SUB_CATEGORY_HEADINGS.Add(adding);
                                db.SaveChanges();
                                item.Heading_Pair_Id = adding.Heading_Pair_Id;
                            }
                        }
                        catch
                        {
                            //silent throw away  NOT MY FAVORITE
                            //but ok because there is nothing else we can do here.
                        }
                    }
                }
                if (!String.IsNullOrWhiteSpace(a.Question_Group_Heading) && !String.IsNullOrWhiteSpace(a.Universal_Sub_Category))
                {
                    var header = db.vQUESTION_HEADINGS.Where(x => x.Question_Group_Heading == a.Question_Group_Heading && x.Universal_Sub_Category == a.Universal_Sub_Category).FirstOrDefault();
                    if (header == null)
                    {//try by id's
                        var header2 = db.UNIVERSAL_SUB_CATEGORY_HEADINGS.Where(x => x.Question_Group_Heading_Id == a.Question_Group_Heading_Id && x.Universal_Sub_Category_Id == a.Universal_Sub_Category_Id).FirstOrDefault();
                        if (header2 != null)
                        {
                            item.Heading_Pair_Id = header2.Heading_Pair_Id;
                        }
                    }
                    else
                    {
                        item.Heading_Pair_Id = header.Heading_Pair_Id;
                    }
                }
                if (item.Heading_Pair_Id > 0)
                {
                    db.SUB_CATEGORY_ANSWERS.Add(item);
                }
            }

            //
            // NCUA data
            //
            List <int> supportedDocIds = db.REQUIRED_DOCUMENTATION.Select(d => d.Documentation_Id).ToList();

            foreach (var a in model.jASSESSMENTS_REQUIRED_DOCUMENTATION)
            {
                if (supportedDocIds.Contains(a.Documentation_Id))
                {
                    var item = TinyMapper.Map <ASSESSMENTS_REQUIRED_DOCUMENTATION>(a);
                    item.Assessment_Id = _assessmentId;
                    db.ASSESSMENTS_REQUIRED_DOCUMENTATION.Add(item);
                }
            }

            foreach (var a in model.jFINANCIAL_ASSESSMENT_VALUES)
            {
                var item = TinyMapper.Map <FINANCIAL_ASSESSMENT_VALUES>(a);
                item.Assessment_Id = _assessmentId;
                db.FINANCIAL_ASSESSMENT_VALUES.Add(item);
            }

            foreach (var a in model.jFINANCIAL_HOURS)
            {
                var item = TinyMapper.Map <FINANCIAL_HOURS>(a);
                item.Assessment_Id = _assessmentId;
                db.FINANCIAL_HOURS.Add(item);
            }

            foreach (var a in model.jASSESSMENT_IRP_HEADER)
            {
                var item = TinyMapper.Map <ASSESSMENT_IRP_HEADER>(a);
                item.Assessment_Id = _assessmentId;
                db.ASSESSMENT_IRP_HEADER.Add(item);
            }

            foreach (var a in model.jASSESSMENT_IRP)
            {
                var item = TinyMapper.Map <ASSESSMENT_IRP>(a);
                item.Assessment_Id = _assessmentId;
                item.Answer_Id     = 0;

                if (db.ASSESSMENT_IRP.Count(ai => ai.IRP_Id == item.IRP_Id) == 0)
                {
                    db.ASSESSMENT_IRP.Add(item);
                }
            }


            try
            {
                db.SaveChanges();
            }
            catch (Exception e)
            {
                throw e;
            }


            return(new Tuple <int, Dictionary <int, DOCUMENT_FILE> >(_assessmentId, oldIdToNewDocument));
        }