public IEnumerable<ValidationResult> PersistValidationErrors(TakeRateFilter filter, FluentValidation.Results.ValidationResult validationResult, bool global = false)
        {
            var results = new List<ValidationResult>();
            
            _takeRateDataStore.FdpValidationClear(filter);

            foreach (var validationError in validationResult.Errors)
            {
                var state = (ValidationState)validationError.CustomState;
                var validationData = new ValidationResult
                {
                    TakeRateId = state.TakeRateId,

                    ValidationRule = state.ValidationRule,

                    FdpVolumeDataItemId = state.FdpVolumeDataItemId,
                    FdpTakeRateSummaryId = state.FdpTakeRateSummaryId,
                    FdpTakeRateFeatureMixId = state.FdpTakeRateFeatureMixId,
                    FdpChangesetDataItemId = state.FdpChangesetDataItemId,

                    MarketId = state.MarketId,
                    ModelId = state.ModelId,
                    FdpModelId = state.FdpModelId,
                    FeatureId = state.FeatureId,
                    FdpFeatureId = state.FdpFeatureId,
                    FeaturePackId = state.FeaturePackId,
                    ExclusiveFeatureGroup = state.ExclusiveFeatureGroup,

                    Message = validationError.ErrorMessage
                };

                validationData = _takeRateDataStore.FdpValidationPersist(validationData, global);
                results.Add(validationData);

                foreach (var childState in state.ChildStates)
                {
                    validationData = new ValidationResult
                    {
                        TakeRateId = childState.TakeRateId,

                        FdpVolumeDataItemId = childState.FdpVolumeDataItemId,
                        FdpTakeRateSummaryId = childState.FdpTakeRateSummaryId,
                        FdpTakeRateFeatureMixId = childState.FdpTakeRateFeatureMixId,
                        FdpChangesetDataItemId = childState.FdpChangesetDataItemId,

                        ValidationRule = state.ValidationRule,

                        MarketId = childState.MarketId,
                        ModelId = childState.ModelId,
                        FdpModelId = childState.FdpModelId,
                        FeatureId = childState.FdpFeatureId,
                        FdpFeatureId = childState.FdpFeatureId,
                        FeaturePackId = childState.FeaturePackId,

                        Message = validationError.ErrorMessage
                    };
                    validationData = _takeRateDataStore.FdpValidationPersist(validationData, global);
                    results.Add(validationData);
                }
            }
            
            return results;
        }
        public ValidationResult FdpValidationPersist(ValidationResult validationData, bool global = false)
        {
            ValidationResult retVal = null;

            using (var conn = DbHelper.GetDBConnection())
            {
                try
                {
                    // Most validation is performed on a per user basis, except when perfomed on initial data process
                    // If this is the case, we want all users to see the validation
                    DynamicParameters para;
                    if (!global)
                    {
                        para = DynamicParameters.FromCDSId(CurrentCDSID);
                    }
                    else
                    {
                        para = new DynamicParameters();
                        para.Add("@CDSId", "", DbType.String);
                    }
                    para.Add("@FdpVolumeHeaderId", validationData.TakeRateId, DbType.Int32);

                    para.Add("@FdpValidationRuleId", (int)validationData.ValidationRule, DbType.Int32);

                    para.Add("@MarketId", validationData.MarketId, DbType.Int32);
                    para.Add("@ModelId", validationData.ModelId, DbType.Int32);
                    para.Add("@FdpModelId", validationData.FdpModelId, DbType.Int32);
                    para.Add("@FeatureId", validationData.FeatureId, DbType.Int32);
                    para.Add("@FdpFeatureId", validationData.FdpFeatureId, DbType.Int32);
                    para.Add("@FeaturePackId", validationData.FeaturePackId, DbType.Int32);
                    para.Add("@ExclusiveFeatureGroup", validationData.ExclusiveFeatureGroup, DbType.String);

                    para.Add("@FdpVolumeDataItemId", validationData.FdpVolumeDataItemId, DbType.Int32);
                    para.Add("@FdpTakeRateSummaryId", validationData.FdpTakeRateSummaryId, DbType.Int32);
                    para.Add("@FdpTakeRateFeatureMixId", validationData.FdpTakeRateFeatureMixId, DbType.Int32);
                    para.Add("@FdpPowertrainDataItemId", validationData.FdpPowertrainDataItemId, DbType.Int32);
                    para.Add("@FdpChangesetDataItemId", validationData.FdpChangesetDataItemId, DbType.Int32);

                    para.Add("@Message", validationData.Message, DbType.String);

                    var results = conn.Query<ValidationResult>("dbo.Fdp_Validation_Persist", para, commandType: CommandType.StoredProcedure);
                    var validationResults = results as IList<ValidationResult> ?? results.ToList();
                    if (results != null && validationResults.Any())
                    {
                        retVal = validationResults.First();
                    }
                }
                catch (Exception ex)
                {
                    Log.Error(ex);
                    throw;
                }
            }
            return retVal;
        }