private void SaveChangesToSicCodes(AdminSicCodeUploadCheckViewModel viewModel)
        {
            foreach (SicCode sicCodeFromUser in viewModel.AddsEditsDeletesSet.ItemsToAdd)
            {
                var sicCode = new SicCode {
                    SicCodeId    = sicCodeFromUser.SicCodeId,
                    SicSectionId = sicCodeFromUser.SicSectionId,
                    Description  = sicCodeFromUser.Description,
                    Synonyms     = sicCodeFromUser.Synonyms
                };
                dataRepository.Insert(sicCode);
            }

            foreach (OldAndNew <SicCode> oldAndNew in viewModel.AddsEditsDeletesSet.ItemsToChange)
            {
                SicCode sicCode = dataRepository.Get <SicCode>(oldAndNew.Old.SicCodeId);

                sicCode.SicSectionId = oldAndNew.New.SicSectionId;
                sicCode.Description  = oldAndNew.New.Description;
                sicCode.Synonyms     = oldAndNew.New.Synonyms;
            }

            foreach (SicCode sicCodeFromUser in viewModel.AddsEditsDeletesSet.ItemsToDelete)
            {
                SicCode sicCode = dataRepository.Get <SicCode>(sicCodeFromUser.SicCodeId);
                dataRepository.Delete(sicCode);
            }

            dataRepository.SaveChanges();
        }
        public IActionResult SicCodeUploadPost(AdminFileUploadViewModel viewModel)
        {
            if (!ReferenceDataHelper.TryParseCsvFileWithHeadings(
                    viewModel.File,
                    new[] { "SicCodeId", "SicSectionId", "Description", "Synonyms" },
                    out List <SicCode> sicCodesFromUploadFile,
                    out string errorMessage))
            {
                viewModel.AddErrorFor(m => m.File, errorMessage);
                return(View("SicCodeUpload", viewModel));
            }

            List <SicCode> sicCodesFromDatabase = dataRepository.GetAll <SicCode>().ToList();

            var sicCodeUploadCheckViewModel = new AdminSicCodeUploadCheckViewModel
            {
                SerializedNewRecords = JsonConvert.SerializeObject(sicCodesFromUploadFile),
                AddsEditsDeletesSet  = new AddsEditsDeletesSet <SicCode>(
                    sicCodesFromDatabase,
                    sicCodesFromUploadFile,
                    s => s.SicCodeId,
                    (s1, s2) => s1.SicSectionId == s2.SicSectionId &&
                    s1.Description == s2.Description &&
                    s1.Synonyms == s2.Synonyms,
                    s => s.OrganisationSicCodes.Count > 0)
            };

            return(View("SicCodeUploadCheck", sicCodeUploadCheckViewModel));
        }
        public IActionResult SicCodeUploadCheckPost(AdminSicCodeUploadCheckViewModel viewModel)
        {
            var newRecords = JsonConvert.DeserializeObject <List <SicCode> >(viewModel.SerializedNewRecords);

            List <SicCode> sicCodesFromDatabase = dataRepository.GetAll <SicCode>().ToList();

            viewModel.AddsEditsDeletesSet =
                new AddsEditsDeletesSet <SicCode>(
                    sicCodesFromDatabase,
                    newRecords,
                    s => s.SicCodeId,
                    (s1, s2) => s1.SicSectionId == s2.SicSectionId &&
                    s1.Description == s2.Description &&
                    s1.Synonyms == s2.Synonyms,
                    s => s.OrganisationSicCodes.Count > 0);

            viewModel.ParseAndValidateParameters(Request, m => m.Reason);
            if (viewModel.HasAnyErrors())
            {
                return(View("SicCodeUploadCheck", viewModel));
            }

            if (viewModel.AddsEditsDeletesSet.AnyItemsThatCannotBeDeleted)
            {
                throw new Exception("Some SIC codes are not allowed to be deleted, because they have OrganisationSicCodes associated with them");
            }

            List <SicCode> existingRecords = dataRepository.GetAll <SicCode>().ToList();

            auditLogger.AuditGeneralAction(AuditedAction.AdminUpdatedSicCodes, new
            {
                ExistingRecords = JsonConvert.SerializeObject(existingRecords.Select(GetSicCodeDetails)),
                NewRecords      = JsonConvert.SerializeObject(newRecords.Select(GetSicCodeDetails)),
                Reason          = viewModel.Reason
            }, User);

            SaveChangesToSicCodes(viewModel);

            return(View("UploadConfirmation", FileUploadType.SicCode));
        }