HydroServerToolsRepository.Repository.VariablesRepository.AddVariables C# (CSharp) Method

AddVariables() public method

public AddVariables ( List itemList, string entityConnectionString, string instanceIdentifier, List &listOfIncorrectRecords, List &listOfCorrectRecords, List &listOfDuplicateRecords, List &listOfEditedRecords ) : void
itemList List
entityConnectionString string
instanceIdentifier string
listOfIncorrectRecords List
listOfCorrectRecords List
listOfDuplicateRecords List
listOfEditedRecords List
return void
        public void AddVariables(List<VariablesModel> itemList, string entityConnectionString, string instanceIdentifier, out List<VariablesModel> listOfIncorrectRecords, out List<VariablesModel> listOfCorrectRecords, out List<VariablesModel> listOfDuplicateRecords, out List<VariablesModel> listOfEditedRecords)
        {
            listOfIncorrectRecords = new List<VariablesModel>();
            listOfCorrectRecords = new List<VariablesModel>();
            listOfDuplicateRecords = new List<VariablesModel>();
            listOfEditedRecords = new List<VariablesModel>();

            //var errorModel = new ErrorModel();

            var context = new ODM_1_1_1EFModel.ODM_1_1_1Entities(entityConnectionString);
            var objContext = ((IObjectContextAdapter)context).ObjectContext;

            //read CV in to list for fster searching
            var variableCV = context.VariableNameCVs.ToList();
            var speciationCV = context.SpeciationCVs.ToList();
            var units = context.Units.Distinct().ToDictionary(p => p.UnitsName.Trim(), p => p.UnitsID);
            var sampleMediumCV = context.SampleMediumCVs.ToList();
            var valueTypeCV = context.ValueTypeCVs.ToList();
            var dataTypeCV = context.DataTypeCVs.ToList();
            var generalCategoryCV = context.GeneralCategoryCVs.ToList();

            //get all variables
            var variablesInDatabase = context.Variables.Select(p => p.VariableCode.ToLower()).ToList();

            var maxCount = itemList.Count;
            var count = 0;
            BusinessObjectsUtils.UpdateCachedprocessStatusMessage(instanceIdentifier, CacheName, String.Format(Ressources.IMPORT_STATUS_PROCESSING, count, maxCount));

            foreach (var item in itemList)
            {
                try
                {
                    BusinessObjectsUtils.UpdateCachedprocessStatusMessage(instanceIdentifier, CacheName, String.Format(Ressources.IMPORT_STATUS_PROCESSING, count, maxCount));
                    count++;

                    //var model = Mapper.Map<VariablesModel, Variable>(item);
                    var model = new Variable();
                    //set deafults
                    model.Speciation = "Not Applicable";
                    model.SampleMedium = "Unknown";
                    model.ValueType = "Unknown";
                    model.IsRegular = false;
                    model.TimeSupport = 0;
                    model.TimeUnitsID = 103;
                    model.DataType = "Unknown";
                    model.GeneralCategory = "Unknown";
                    model.NoDataValue = -9999;

                    var listOfErrors = new List<ErrorModel>();
                    var listOfUpdates = new List<UpdateFieldsModel>();

                    //need to look up Id's for VariableName, Speciation, VariableUnitsName, SampleMedium, ValueType, DataType, GeneralCategory, TimeUnitsName
                    //User has no concept of ID's
                    bool isRejected = false;
                    //VariableCode
                    if (!string.IsNullOrWhiteSpace(item.VariableCode))
                    {
                        if (RepositoryUtils.containsNotOnlyAllowedCaracters(item.VariableCode))
                        {
                            var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_INVALIDCHARACTERS, "VariableCode")); listOfErrors.Add(err); isRejected = true;
                        }
                        else
                        {
                            model.VariableCode = item.VariableCode;
                        }

                    }
                    else
                    {
                        var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_CANNOTBEEMPTY, "VariableCode")); listOfErrors.Add(err); isRejected = true;
                    }
                    //VariableName
                    if (!string.IsNullOrWhiteSpace(item.VariableName))
                    {
                        var variableName = variableCV
                                          .Where(a => a.Term.ToString().ToLower() == item.VariableName.ToLower()).SingleOrDefault();

                        if (variableName == null)
                        {
                            var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_NOT_IN_CV, item.VariableName, "variableName"));
                            listOfErrors.Add(err);
                            isRejected = true;
                        }
                        else
                        {
                            model.VariableName = variableName.Term;
                        }

                    }
                    else
                    {
                        var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_CANNOTBEEMPTY, "VariableName")); listOfErrors.Add(err); isRejected = true;
                    }
                    //Speciation
                    if (!string.IsNullOrWhiteSpace(item.Speciation))
                    {
                        var speciation = speciationCV
                                          .Where(a => a.Term.ToString().ToLower() == item.Speciation.ToLower()).SingleOrDefault();

                        if (speciation == null)
                        {
                            var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_NOT_IN_CV, item.Speciation, "Speciation"));
                            listOfErrors.Add(err);
                            isRejected = true;
                        }
                        else
                        {
                            model.Speciation = item.Speciation;
                        }

                    }
                    else
                    {
                        var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_CANNOTBEEMPTY, "Speciation")); listOfErrors.Add(err); isRejected = true;
                    }
                    //VariableUnitsName
                    if (!string.IsNullOrWhiteSpace(item.VariableUnitsName))
                    {
                        if (RepositoryUtils.containsSpecialCharacters(item.VariableUnitsName))
                        {
                            var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_INVALIDCHARACTERS, "VariableUnitsName")); listOfErrors.Add(err); isRejected = true;
                        }
                        else
                        {

                            int result;
                            bool canConvert = UniversalTypeConverter.TryConvertTo<int>(item.VariableUnitsName, out result);
                            if (canConvert)//user used id
                            {

                                if (result != 0)
                                {
                                    model.VariableUnitsID = result;
                                    item.VariableUnitsID = result.ToString();
                                }
                                else
                                {
                                    var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_INVALIDVALUE, "VariableUnitsName")); listOfErrors.Add(err); isRejected = true;
                                }
                            }
                            else
                            {
                                    var variableUnitsID = units
                                        .Where(a => a.Key.ToLower() == item.VariableUnitsName.ToLower())
                                        .Select(a => a.Value)
                                        .SingleOrDefault();
                                    if (variableUnitsID != 0)
                                    {
                                        model.VariableUnitsID = variableUnitsID;
                                        item.VariableUnitsID = variableUnitsID.ToString();
                                    }
                                    else
                                    {
                                        var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_INVALIDVALUE, "VariableUnitsName")); listOfErrors.Add(err); isRejected = true;
                                    }
                            }
                        }
                    }
                    else
                    {
                        var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_CANNOTBEEMPTY, "VariableUnitsName")); listOfErrors.Add(err); isRejected = true;
                    }
                    //SampleMedium
                    if (!string.IsNullOrWhiteSpace(item.SampleMedium))
                    {
                        var sampleMedium = sampleMediumCV
                                            .Where(a => a.Term.ToString().ToLower() == item.SampleMedium.ToLower()).FirstOrDefault();
                        if (sampleMedium == null)
                        {
                            var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_NOT_IN_CV, item.SampleMedium, "SampleMedium"));
                            listOfErrors.Add(err);
                            isRejected = true;
                        }
                        else
                        {
                            model.SampleMedium = sampleMedium.Term;
                        }

                    }
                    else
                    {
                        var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_CANNOTBEEMPTY, "SampleMedium")); listOfErrors.Add(err); isRejected = true;
                    }
                    //ValueType
                    if (!string.IsNullOrWhiteSpace(item.ValueType))
                    {
                        var valueType = valueTypeCV
                                           .Where(a => a.Term.ToString().ToLower() == item.ValueType.ToLower()).FirstOrDefault();
                        if (valueType == null)
                        {
                            var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_NOT_IN_CV, item.ValueType, "ValueType"));
                            listOfErrors.Add(err);
                            isRejected = true;
                        }
                        else
                        {
                            model.ValueType = valueType.Term;
                        }

                    }
                    else
                    {
                        var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_CANNOTBEEMPTY, "ValueType")); listOfErrors.Add(err); isRejected = true;
                    }
                    //IsRegular
                    if (!string.IsNullOrWhiteSpace(item.IsRegular))
                    {
                        bool result;
                        bool canConvert = UniversalTypeConverter.TryConvertTo<bool>(item.IsRegular, out result);

                        if (!canConvert)
                        {
                            var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_NOT_IN_CV, item.IsRegular, "IsRegular"));
                            listOfErrors.Add(err);
                            isRejected = true;
                        }
                        else
                        {
                            model.IsRegular = result;
                        }

                    }
                    else
                    {
                        var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_CANNOTBEEMPTY, "IsRegular")); listOfErrors.Add(err); isRejected = true;
                    }
                    //TimeSupport
                    if (!string.IsNullOrWhiteSpace(item.TimeSupport))
                    {
                        double result;
                        bool canConvert = UniversalTypeConverter.TryConvertTo<double>(item.TimeSupport, out result);

                        if (!canConvert)
                        {
                            var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_NOT_IN_CV, item.TimeSupport, "TimeSupport"));
                            listOfErrors.Add(err);
                            isRejected = true;
                        }
                        else
                        {
                            model.TimeSupport = result;
                        }

                    }
                    else
                    {
                        var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_CANNOTBEEMPTY, "TimeSupport")); listOfErrors.Add(err); isRejected = true;
                    }
                    //TimeUnitsID
                    if (!string.IsNullOrWhiteSpace(item.TimeUnitsName))
                    {
                        if (RepositoryUtils.containsSpecialCharacters(item.TimeUnitsName))
                        {
                            var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_INVALIDCHARACTERS, "TimeUnitsName")); listOfErrors.Add(err); isRejected = true;
                        }
                        else
                        {

                            int result;
                            bool canConvert = UniversalTypeConverter.TryConvertTo<int>(item.TimeUnitsName, out result);
                            if (canConvert)//user used id
                            {

                                if (result != 0)
                                {
                                    model.TimeUnitsID = result;
                                    item.TimeUnitsID = result.ToString();
                                }
                                else
                                {
                                    var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_INVALIDVALUE, "TimeUnitsName")); listOfErrors.Add(err); isRejected = true;
                                }
                            }
                            else
                            {
                                var timeUnitsID = units
                                   .Where(a => a.Key.ToLower() == item.TimeUnitsName.ToLower())
                                   .Select(a => a.Value)
                                   .SingleOrDefault();
                                if (timeUnitsID != 0)
                                {
                                    model.TimeUnitsID = timeUnitsID;
                                    item.TimeUnitsID = timeUnitsID.ToString();
                                }
                                else
                                {
                                    var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_INVALIDVALUE, "TimeUnitsName")); listOfErrors.Add(err); isRejected = true;
                                }
                            }
                        }
                    }
                    else
                    {
                        var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_CANNOTBEEMPTY, "TimeUnitsName")); listOfErrors.Add(err); isRejected = true;
                    }
                    //DataType
                    if (!string.IsNullOrWhiteSpace(item.DataType))
                    {
                        var dataType = dataTypeCV
                                           .Where(a => a.Term.ToString().ToLower() == item.DataType.ToLower()).FirstOrDefault();
                        if (dataType == null)
                        {
                            var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_NOT_IN_CV, item.DataType, "DataType"));
                            listOfErrors.Add(err);
                            isRejected = true;
                        }
                        else
                        {
                            model.DataType = dataType.Term;
                        }

                    }
                    else
                    {
                        var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_CANNOTBEEMPTY, "DataType")); listOfErrors.Add(err); isRejected = true;
                    }
                    //GeneralCategory
                    if (!string.IsNullOrWhiteSpace(item.GeneralCategory))
                    {
                        var generalCategory = generalCategoryCV
                                            .Where(a => a.Term.ToString().ToLower() == item.GeneralCategory.ToLower()).FirstOrDefault();
                        if (generalCategory == null)
                        {
                            var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_NOT_IN_CV, item.GeneralCategory, "GeneralCategory"));
                            listOfErrors.Add(err);
                            isRejected = true;
                        }
                        else
                        {
                            model.GeneralCategory = generalCategory.Term;
                        }

                    }
                    else
                    {
                        var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_CANNOTBEEMPTY, "GeneralCategory")); listOfErrors.Add(err); isRejected = true;
                    }
                    //NoDataValue
                    if (!string.IsNullOrWhiteSpace(item.NoDataValue))
                    {
                        double result;
                        bool canConvert = UniversalTypeConverter.TryConvertTo<double>(item.NoDataValue, out result);
                        if (!canConvert)
                        {
                            var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_FAILED_NOVALIDDATA, "NoDataValue"));
                            listOfErrors.Add(err);
                            isRejected = true;
                        }
                        else
                        {
                            model.NoDataValue = result;
                        }

                    }
                    else
                    {
                        var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_CANNOTBEEMPTY, "NoDataValue")); listOfErrors.Add(err); isRejected = true;
                    }

                    if (isRejected)
                    {
                        var sb = new StringBuilder();
                        foreach (var er in listOfErrors)
                        {
                            sb.Append(er.ErrorMessage + ";");
                        }
                        item.Errors = sb.ToString();
                        listOfIncorrectRecords.Add(item);
                        continue;
                    }

                    //lookup duplicates
                    //var objectSet = objContext.CreateObjectSet<ODM_1_1_1EFModel.Variable>().EntitySet;//.EntitySet;
                    //check if item with this variablecode exists in the database
                    var doesExist = variablesInDatabase.Find(p => p == item.VariableCode.ToLower());

                    if (doesExist == null)
                    {
                        var existInUpload = listOfCorrectRecords.Exists(a => a.VariableCode == item.VariableCode);
                        if (!existInUpload)
                        {
                            //context.Sites.Add(model);
                            //context.SaveChanges();
                            listOfCorrectRecords.Add(item);
                        }
                        else
                        {
                            var err = new ErrorModel("AddVariables", string.Format(Ressources.IMPORT_VALUE_ISDUPLICATE, "VariableCode")); listOfErrors.Add(err); isRejected = true;
                            listOfIncorrectRecords.Add(item);
                            item.Errors += err.ErrorMessage + ";";
                        }
                    }
                    else
                    {
                        var existingItem = context.Variables.Where(a => a.VariableCode == item.VariableCode).FirstOrDefault();

                        //if (existingItem.VariableCode != model.VariableCode) { listOfUpdates.Add(new UpdateFieldsModel("Variables", "VariableCode", existingItem.VariableCode.ToString(), item.VariableCode.ToString())); }
                        if (model.VariableName != null && existingItem.VariableName != model.VariableName) { listOfUpdates.Add(new UpdateFieldsModel("Variables", "VariableName", existingItem.VariableName.ToString(), item.VariableName.ToString())); }
                        if (model.Speciation != model.Speciation) { listOfUpdates.Add(new UpdateFieldsModel("Variables", "Speciation", existingItem.Speciation.ToString(), item.Speciation.ToString())); }
                        if (model.VariableUnitsID != model.VariableUnitsID) { listOfUpdates.Add(new UpdateFieldsModel("Variables", "VariableUnitsID", existingItem.Unit1.UnitsName.ToString(), item.VariableUnitsName.ToString())); }
                        if (model.SampleMedium != model.SampleMedium) { listOfUpdates.Add(new UpdateFieldsModel("Variables", "SampleMedium", existingItem.SampleMedium.ToString(), item.SampleMedium.ToString())); }
                        if (model.ValueType != model.ValueType) { listOfUpdates.Add(new UpdateFieldsModel("Variables", "ValueType", existingItem.ValueType.ToString(), item.ValueType.ToString())); }
                        if (model.IsRegular != model.IsRegular) { listOfUpdates.Add(new UpdateFieldsModel("Variables", "IsRegular", existingItem.IsRegular.ToString(), item.IsRegular.ToString())); }
                        if (model.TimeSupport != model.TimeSupport) { listOfUpdates.Add(new UpdateFieldsModel("Variables", "TimeSupport", existingItem.TimeSupport.ToString(), item.TimeSupport.ToString())); }
                        if (model.TimeUnitsID != model.TimeUnitsID) { listOfUpdates.Add(new UpdateFieldsModel("Variables", "TimeUnitsID", existingItem.Unit1.UnitsName, item.TimeUnitsName.ToString())); }
                        if (model.DataType != model.DataType) { listOfUpdates.Add(new UpdateFieldsModel("Variables", "DataType", existingItem.DataType.ToString(), item.DataType.ToString())); }
                        if (model.GeneralCategory != model.GeneralCategory) { listOfUpdates.Add(new UpdateFieldsModel("Variables", "GeneralCategory", existingItem.GeneralCategory.ToString(), item.GeneralCategory.ToString())); }
                        if (model.NoDataValue != model.NoDataValue) { listOfUpdates.Add(new UpdateFieldsModel("Variables", "NoDataValue", existingItem.NoDataValue.ToString(), item.NoDataValue.ToString())); }

                        if (listOfUpdates.Count() > 0)
                        {
                            listOfEditedRecords.Add(item);
                            var sb = new StringBuilder();
                            foreach (var u in listOfUpdates)
                            {
                                sb.Append(string.Format(Ressources.IMPORT_VALUE_UPDATED, u.ColumnName, u.CurrentValue, u.UpdatedValue + ";"));
                            }
                            item.Errors = sb.ToString();

                            continue;
                        }
                        else
                        {
                            listOfDuplicateRecords.Add(item);
                        }

                    }
                }
                catch (Exception ex)
                {
                    listOfIncorrectRecords.Add(item);
                }
            }

            return;
        }