public List <string> WarningValidation()
        {
            List <string> warnings = new List <string>();

            IRepository           repository    = null;
            IFeatureConfiguration featureConfig = null;

            if (ServiceLocator.IsLocationProviderSet)
            {
                try
                {
                    repository    = ServiceLocator.Current.GetInstance(typeof(IRepository)) as IRepository;
                    featureConfig = ServiceLocator.Current.GetInstance(typeof(IFeatureConfiguration)) as IFeatureConfiguration;
                }
                catch (ActivationException)
                {
                    //do nothing
                }
            }

            try
            {
                if (LegacyMappings.Any(x => x.LegacySystemName == LegacySystemNames.Subscriber.Name))
                {
                    if (TapeAddress != null)
                    {
                        if (repository != null)
                        {
                            if (MainframeAddressOverride == null)
                            {
                                var formatter        = new MainframeAddressFormatter(repository);
                                var convertedAddress = formatter.ConvertShippingAddress(this);
                                if (
                                    (convertedAddress.Name ?? string.Empty).Length <= 24 &&
                                    (convertedAddress.Line1 ?? string.Empty).Length <= 24 &&
                                    (convertedAddress.Line2 ?? string.Empty).Length <= 24 &&
                                    (convertedAddress.Line3 ?? string.Empty).Length <= 24 &&
                                    (convertedAddress.Line4 ?? string.Empty).Length <= 24
                                    )
                                {
                                    warnings.Add("Shipping Address is tape compliant. Please remove Tape address if it is no longer needed.");
                                }
                            }
                            else
                            {
                                if (
                                    (MainframeAddressOverride.Name ?? string.Empty).Length <= 24 &&
                                    (MainframeAddressOverride.Line1 ?? string.Empty).Length <= 24 &&
                                    (MainframeAddressOverride.Line2 ?? string.Empty).Length <= 24 &&
                                    (MainframeAddressOverride.Line3 ?? string.Empty).Length <= 24 &&
                                    (MainframeAddressOverride.Line4 ?? string.Empty).Length <= 24 &&
                                    (MainframeAddressOverride.Line5 ?? string.Empty).Length <= 24
                                    )
                                {
                                    warnings.Add("Mainframe Override Address is tape compliant. Please remove Tape address if it is no longer needed.");
                                }
                            }
                        }
                    }

                    if (ShippingProfile != null)
                    {
                        var tempGST = ShippingProfile.GSTExempt.HasValue ? (bool)ShippingProfile.GSTExempt : false;
                        var tempQST = ShippingProfile.QSTExempt.HasValue ? (bool)ShippingProfile.QSTExempt : false;

                        if (string.IsNullOrWhiteSpace(ShippingProfile.VATCountryCode) && LegacyMappings[0].LegacyIdentifier.StartsWith("Z"))
                        {
                            warnings.Add("VAT Country Code not selected.");
                        }

                        //if (!string.IsNullOrEmpty(ShippingProfile?.Postage))
                        //{

                        //    if (new[] { " " }.Contains(ShippingProfile.Postage) && CountryCode != "US")
                        //    {
                        //        warnings.Add("US postage may not be valid based on shipping address.");
                        //    }

                        //    if (new[] { "F" }.Contains(ShippingProfile.Postage) && (CountryCode == "US" || CountryCode == "CA"))
                        //    {
                        //        warnings.Add("Foreign postage may not be valid based on shipping address.");
                        //    }

                        //    if (new[] { "P" }.Contains(ShippingProfile.Postage) && (CountryCode == "US" || CountryCode == "CA"))
                        //    {
                        //        warnings.Add("Pan-American postage may not be valid based on shipping address.");
                        //    }

                        //    if (new[] { "C" }.Contains(ShippingProfile.Postage) && CountryCode != "CA")
                        //    {
                        //        warnings.Add("Canadian postage may not be valid based on shipping address.");
                        //    }

                        //    if (!new[] { "C" }.Contains(ShippingProfile.Postage) && CountryCode == "CA")
                        //    {
                        //        warnings.Add("Non-Canadian postage may not be valid based on shipping address.");
                        //    }

                        //}
                        //var flag = featureConfig.IsAvailable(FeaturesEnum.)
                        //_log.

                        if (featureConfig.IsAvailable(FeaturesEnum.AddJetsDropAddress))
                        {
                            if (!string.IsNullOrEmpty(ShippingProfile?.Postage))
                            {
                                string countryCode = CountryCode;
                                bool   isAlternateShippingAddress = false;

                                if (JetsAddress != null)
                                {
                                    countryCode = JetsAddress.CountryCode;
                                    isAlternateShippingAddress = true;
                                }
                                else if (DropAddress != null)
                                {
                                    countryCode = DropAddress.CountryCode;
                                    isAlternateShippingAddress = true;
                                }

                                if (ShippingProfile.Postage == "C" && countryCode != "CA")
                                {
                                    warnings.Add(isAlternateShippingAddress ? "Canadian postage may not be valid based on alternate shipping address." : "Canadian postage may not be valid based on shipping address.");
                                }

                                if (ShippingProfile.Postage == "F" && countryCode == "CA")
                                {
                                    warnings.Add(isAlternateShippingAddress ? "Foreign postage may not be valid based on alternate shipping address." : "Foreign postage may not be valid based on shipping address.");
                                }

                                if (ShippingProfile.Postage == "P" && countryCode == "CA")
                                {
                                    warnings.Add(isAlternateShippingAddress ? "Pan-American postage may not be valid based on alternate shipping address." : "Pan-American postage may not be valid based on shipping address.");
                                }
                            }
                        }
                        else
                        {
                            if (!string.IsNullOrEmpty(ShippingProfile?.Postage))
                            {
                                if (new[] { " " }.Contains(ShippingProfile.Postage) && CountryCode != "US")
                                {
                                    warnings.Add("US postage may not be valid based on shipping address.");
                                }

                                if (new[] { "F" }.Contains(ShippingProfile.Postage) && (CountryCode == "US" || CountryCode == "CA"))
                                {
                                    warnings.Add("Foreign postage may not be valid based on shipping address.");
                                }

                                if (new[] { "P" }.Contains(ShippingProfile.Postage) && (CountryCode == "US" || CountryCode == "CA"))
                                {
                                    warnings.Add("Pan-American postage may not be valid based on shipping address.");
                                }

                                if (new[] { "C" }.Contains(ShippingProfile.Postage) && CountryCode != "CA")
                                {
                                    warnings.Add("Canadian postage may not be valid based on shipping address.");
                                }

                                if (!new[] { "C" }.Contains(ShippingProfile.Postage) && CountryCode == "CA")
                                {
                                    warnings.Add("Non-Canadian postage may not be valid based on shipping address.");
                                }
                            }
                        }

                        if (!ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.Individual) &&
                            new[] { "CD", "CI", "EN", "GD", "HD", "IN", "LN", "MN", "PR", "SN", "XI" }.Contains(ShippingProfile.CustomerCategory))
                        {
                            warnings.Add("Rate Class selection does not match Customer Category.");
                        }

                        if (ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.Individual) &&
                            !new[] { "CD", "CI", "EN", "GD", "HD", "IN", "LN", "MN", "PR", "SN", "XI" }.Contains(ShippingProfile.CustomerCategory))
                        {
                            warnings.Add("Rate Class selection does not match Customer Category.");
                        }

                        //POSTAGE
                        if (ShippingProfile.Postage != "C")
                        {
                            if (CountryCode == "CA" && tempGST == false)
                            {
                                warnings.Add("Must be GST Exempt for Postage Code.");
                            }
                        }

                        if (ShippingProfile.Postage != "C")
                        {
                            if (CountryCode == "CA" && tempQST == false)
                            {
                                warnings.Add("Must be QST Exempt for Postage Code.");
                            }
                        }
                    }

                    if (TapeAddress == null && JetsAddress == null && DropAddress == null)
                    {
                        if (MainframeAddressOverride == null)
                        {
                            if (repository != null)
                            {
                                var formatter        = new MainframeAddressFormatter(repository);
                                var convertedAddress = formatter.ConvertShippingAddress(this);

                                if ((convertedAddress.Name ?? string.Empty).Length > 24 ||
                                    (convertedAddress.Line1 ?? string.Empty).Length > 24 ||
                                    (convertedAddress.Line2 ?? string.Empty).Length > 24 ||
                                    (convertedAddress.Line3 ?? string.Empty).Length > 24 ||
                                    (convertedAddress.Line4 ?? string.Empty).Length > 24
                                    )
                                {
                                    warnings.Add("Shipping Address is not tape compliant. Please enter a Tape address if one is needed.");
                                }
                            }
                        }
                    }
                }

                if (TapeAddress == null && JetsAddress == null && DropAddress == null)
                {
                    if (repository != null)
                    {
                        if (MainframeAddressOverride != null)
                        {
                            if (
                                (MainframeAddressOverride.Name ?? string.Empty).Length > 24 ||
                                (MainframeAddressOverride.Line1 ?? string.Empty).Length > 24 ||
                                (MainframeAddressOverride.Line2 ?? string.Empty).Length > 24 ||
                                (MainframeAddressOverride.Line3 ?? string.Empty).Length > 24 ||
                                (MainframeAddressOverride.Line4 ?? string.Empty).Length > 24 ||
                                (MainframeAddressOverride.Line5 ?? string.Empty).Length > 24
                                )
                            {
                                warnings.Add("Mainframe Override Address is not tape compliant. Please enter a Tape address if one is needed.");
                            }
                        }
                    }
                }

                return(warnings);
            }
            finally
            {
                repository?.Dispose();
            }
        }
        public IEnumerable <ValidationResult> Validate(ValidationContext validationContext)
        {
            var results = new List <ValidationResult>();

            if ((new[] { "US", "CA" }.Contains(CountryCode)) && string.IsNullOrWhiteSpace(PostalCode))
            {
                results.Add(new ValidationResult("Postal is required.", new[] { "Postal" }));
            }

            if (CountryCode == "US" && PostalCode != null && !Regex.Match(PostalCode, @"^\d{1,5}(\-\d{4})?$").Success)
            {
                results.Add(new ValidationResult("Postal is not valid.", new[] { "Postal" }));
            }

            if ((new[] { "US", "CA", "AU" }.Contains(CountryCode)) && string.IsNullOrWhiteSpace(StateProvince))
            {
                results.Add(new ValidationResult("State is required.", new[] { "StateProvince" }));
            }

            if (CountryCode == "CA" && PostalCode != null && !Regex.Match(PostalCode, @"(\D\d\D\s\d\D\d)").Success)
            {
                results.Add(new ValidationResult("Postal is not valid.", new[] { "Postal" }));
            }

            if (MainframeAddressOverride != null)
            {
                if (string.IsNullOrWhiteSpace(MainframeAddressOverride.PostalCode) && (MainframeAddressOverride.CountryCode == "US"))
                {
                    results.Add(new ValidationResult("ZIP is required.", new[] { "Postal" }));
                }

                if (!string.IsNullOrWhiteSpace(MainframeAddressOverride.PostalCode) && !(MainframeAddressOverride.CountryCode == "US"))
                {
                    results.Add(new ValidationResult("ZIP is for US only.", new[] { "Postal" }));
                }
            }


            var accountLegacyMapping = LegacyMappings.FirstOrDefault(x => x.LegacySystemName == LegacySystemNames.Account.Name);

            if (accountLegacyMapping != null && BillingProfile != null)
            {
                if (accountLegacyMapping.LegacyIdentifier.StartsWith("Z") && BillingProfile.TaxExemptNumber != null)
                {
                    results.Add(new ValidationResult("Tax Exempt Number cannot be used for this office."));
                }

                //VAT Number  Office != Z * Value is not null   VAT Number cannot be used for this office.
                if (BillingProfile.VATNumber != null && !accountLegacyMapping.LegacyIdentifier.StartsWith("Z"))
                {
                    results.Add(new ValidationResult("VAT Number cannot be used for this office.", new[] { "VATNumber" }));
                }
            }

            //GST Exempt  Billing Address Country != Canada  Value = Y   Country cannot be GST Exempt.
            if (BillingProfile.GSTExempt == true && CountryCode != "CA")
            {
                results.Add(new ValidationResult("Country cannot be GST Exempt."));
            }


            //QST Exempt  Billing Address Country != Canada  Value = Y   Country cannot be QST Exempt.
            if (BillingProfile.QSTExempt == true && CountryCode != "CA")
            {
                results.Add(new ValidationResult("Country cannot be QST Exempt."));
            }



            if (results.Count > 0)
            {
                return(results);
            }


            IValidationRepository validator  = null;
            IRepository           repository = null;

            try
            {
                if (ServiceLocator.IsLocationProviderSet)
                {
                    try
                    {
                        validator  = ServiceLocator.Current.GetInstance <IValidationRepository>();
                        repository = ServiceLocator.Current.GetInstance(typeof(IRepository)) as IRepository;
                    }
                    catch (ActivationException) { }
                }

                /* validate the address using the tax service */
                if (validator != null)
                {
                    if (!validator.ValidateTaxAddress(this))
                    {
                        results.Add(new ValidationResult("Billing Address is not tax compliant.  City and/or Postal Code are invalid for the selected Country.", new[] { "SystemAddress" }));
                    }

                    string errorMessage;
                    if (!validator.ValidateBillingLocation(this, out errorMessage))
                    {
                        results.Add(new ValidationResult(string.Format("Billing location failed SAP validation: {0}", errorMessage), null));
                    }
                }


                if (LegacyMappings.Any(x => x.LegacySystemName == LegacySystemNames.Suffix.Name))
                {
                    if (MainframeAddressOverride == null)
                    {
                        if (repository != null)
                        {
                            var formatter        = new MainframeAddressFormatter(repository);
                            var convertedAddress = formatter.ConvertBillingAddress(this);
                            if (
                                (convertedAddress.Name ?? string.Empty).Length > 30 ||
                                (convertedAddress.Line1 ?? string.Empty).Length > 30 ||
                                (convertedAddress.Line2 ?? string.Empty).Length > 30 ||
                                (convertedAddress.Line3 ?? string.Empty).Length > 30
                                )
                            {
                                results.Add(new ValidationResult("Billing Address is not mainframe compliant. Please use Mainframe Override address."));
                            }
                        }
                    }
                    else
                    {
                        /* Check if the billing address is mainframe compliant and still mainframe override address is provided  */
                        if (repository != null)
                        {
                            var formatter        = new MainframeAddressFormatter(repository);
                            var convertedAddress = formatter.ConvertBillingAddress(this);
                            if (
                                (convertedAddress.Name ?? string.Empty).Length <= 30 &&
                                (convertedAddress.Line1 ?? string.Empty).Length <= 30 &&
                                (convertedAddress.Line2 ?? string.Empty).Length <= 30 &&
                                (convertedAddress.Line3 ?? string.Empty).Length <= 30
                                )
                            {
                                results.Add(new ValidationResult(
                                                "Billing Address is mainframe compliant. Please remove Mainframe Override address."));
                                return(results);
                            }
                        }

                        var context = new ValidationContext(MainframeAddressOverride, serviceProvider: null, items: null);
                        Validator.TryValidateObject(MainframeAddressOverride, context, results, true);
                    }

                    if (BillingProfile != null)
                    {
                        var context = new ValidationContext(BillingProfile, serviceProvider: null, items: null);
                        Validator.TryValidateObject(BillingProfile, context, results, true);
                    }


                    if (repository == null)
                    {
                        return(results);
                    }

                    if (accountLegacyMapping == null)
                    {
                        return(results);
                    }

                    var suffixLegacyMapping = LegacyMappings.First(x => x.LegacySystemName == LegacySystemNames.Suffix.Name);

                    var countries = repository.GetCountries();
                    var country   = countries.FirstOrDefault(x => x.Value == CountryCode);
                    if (string.IsNullOrEmpty(country?.MainframeShortCode) && MainframeAddressOverride == null)
                    {
                        results.Add(new ValidationResult("Billing Address is not mainframe compliant. Mainframe does not support the specified country.  Please use Mainframe Override Address."));
                    }
                }

                return(results);
            }
            finally
            {
                validator?.Dispose();
                repository?.Dispose();
            }
        }
        public new IEnumerable <ValidationResult> Validate(ValidationContext validationContext)
        {
            IFeatureConfiguration featureConfig = null;

            if (ServiceLocator.IsLocationProviderSet)
            {
                try
                {
                    featureConfig = ServiceLocator.Current.GetInstance(typeof(IFeatureConfiguration)) as IFeatureConfiguration;
                }
                catch (ActivationException)
                {
                    //do nothing
                }
            }

            var results = new List <ValidationResult>();

            if ((new[] { "US", "CA" }.Contains(CountryCode)) && string.IsNullOrWhiteSpace(PostalCode))
            {
                results.Add(new ValidationResult("Postal is required.", new[] { "Postal" }));
            }

            if (CountryCode == "US" && PostalCode != null && !Regex.Match(PostalCode, @"^\d{1,5}(\-\d{4})?$").Success)
            {
                results.Add(new ValidationResult("Postal is not valid.", new[] { "Postal" }));
            }

            if ((new[] { "US", "CA", "AU" }.Contains(CountryCode)) && string.IsNullOrWhiteSpace(StateProvince))
            {
                results.Add(new ValidationResult("State is required.", new[] { "StateProvince" }));
            }

            if (CountryCode == "CA" && PostalCode != null && !Regex.Match(PostalCode, @"(\D\d\D\s\d\D\d)").Success)
            {
                results.Add(new ValidationResult("Postal is not valid.", new[] { "Postal" }));
            }

            if (FteCounts?.Select(x => x.CountType).Distinct().Count() != FteCounts?.Select((x => x.CountType)).Count())
            {
                results.Add(new ValidationResult("FTE Type cannot be selected more than once.", new[] { "Fte" }));
            }

            if (ShippingProfile != null)
            {
                var tempGST = ShippingProfile.GSTExempt.HasValue ? (bool)ShippingProfile.GSTExempt : false;
                var tempQST = ShippingProfile.QSTExempt.HasValue ? (bool)ShippingProfile.QSTExempt : false;

                if (CountryCode != "CA" && tempGST)
                {
                    results.Add(new ValidationResult("Country cannot be GST Exempt.", new[] { "GST Exempt" }));
                }

                if (CountryCode != "CA" && tempQST)
                {
                    results.Add(new ValidationResult("Country cannot be QST Exempt.", new[] { "QST Exempt" }));
                }

                //LANGUAGE
                var accountLegacyMapping = LegacyMappings.FirstOrDefault(x => x.LegacySystemName == LegacySystemNames.Account.Name);
                if (accountLegacyMapping != null)
                {
                    if (!string.IsNullOrWhiteSpace(ShippingProfile.Language) &&
                        !accountLegacyMapping.LegacyIdentifier.StartsWith("Z") &&
                        !new[] { "AU", "BA", "FB", "JA", "KO", "NZ", "TO", "TQ", "TW" }.Contains(accountLegacyMapping.LegacyIdentifier.Substring(0, 2)))
                    {
                        results.Add(new ValidationResult("Language cannot be selected for this office.", new[] { "Language" }));
                    }

                    if (!string.IsNullOrWhiteSpace(ShippingProfile.Language) &&
                        //!new[] { "DU - Dutch", "EN - Englisth", "FR - French", "GE - German", "IT - Italian", "PR - Portuguese", "SO - South African", "SP - Spanish", "TU - Turkish" }.Contains(ShippingProfile.Language))
                        !new[] { "DU", "EN", "FR", "GE", "IT", "PR", "SO", "SP", "TU" }.Contains(ShippingProfile.Language))
                    {
                        results.Add(new ValidationResult("Language code is invalid.", new[] { "Language" }));
                    }

                    if (featureConfig.IsAvailable(FeaturesEnum.SplitTaxExemptAndVatOnShippingProfile))
                    {
                        if (ShippingProfile != null)
                        {
                            if (accountLegacyMapping.LegacyIdentifier.StartsWith("Z") && !string.IsNullOrEmpty(ShippingProfile.TaxExemptNumber))
                            {
                                results.Add(new ValidationResult("Tax Exempt Number cannot be used for this office."));
                            }

                            //VAT Number  Office != Z * Value is not null   VAT Number cannot be used for this office.
                            if (!string.IsNullOrEmpty(ShippingProfile.VATNumber) && !accountLegacyMapping.LegacyIdentifier.StartsWith("Z"))
                            {
                                results.Add(new ValidationResult("VAT Number cannot be used for this office.", new[] { "VATNumber" }));
                            }
                        }
                    }
                }

                //ITEM FORMATS
                var ItemFormat1Thru6 = new List <string>();

                if (!string.IsNullOrWhiteSpace(ShippingProfile.ItemFormat1))
                {
                    ItemFormat1Thru6.Add(ShippingProfile.ItemFormat1);
                }

                if (!string.IsNullOrWhiteSpace(ShippingProfile.ItemFormat2))
                {
                    ItemFormat1Thru6.Add(ShippingProfile.ItemFormat2);
                    if (ItemFormat1Thru6.Distinct().Count() != ItemFormat1Thru6.Count())
                    {
                        results.Add(new ValidationResult("Item Formats cannot be selected more than once.", new[] { "ItemFormat2" }));
                    }
                }


                if (!string.IsNullOrWhiteSpace(ShippingProfile.ItemFormat3))
                {
                    ItemFormat1Thru6.Add(ShippingProfile.ItemFormat3);
                    if (ItemFormat1Thru6.Distinct().Count() != ItemFormat1Thru6.Count())
                    {
                        results.Add(new ValidationResult("Item Formats cannot be selected more than once.", new[] { "ItemFormat3" }));
                    }
                }

                if (!string.IsNullOrWhiteSpace(ShippingProfile.ItemFormat4))
                {
                    ItemFormat1Thru6.Add(ShippingProfile.ItemFormat4);
                    if (ItemFormat1Thru6.Distinct().Count() != ItemFormat1Thru6.Count())
                    {
                        results.Add(new ValidationResult("Item Formats cannot be selected more than once.", new[] { "ItemFormat4" }));
                    }
                }

                if (!string.IsNullOrWhiteSpace(ShippingProfile.ItemFormat5))
                {
                    ItemFormat1Thru6.Add(ShippingProfile.ItemFormat5);
                    if (ItemFormat1Thru6.Distinct().Count() != ItemFormat1Thru6.Count())
                    {
                        results.Add(new ValidationResult("Item Formats cannot be selected more than once.", new[] { "ItemFormat5" }));
                    }
                }

                if (!string.IsNullOrWhiteSpace(ShippingProfile.ItemFormat6))
                {
                    ItemFormat1Thru6.Add(ShippingProfile.ItemFormat6);
                    if (ItemFormat1Thru6.Distinct().Count() != ItemFormat1Thru6.Count())
                    {
                        results.Add(new ValidationResult("Item Formats cannot be selected more than once.", new[] { "ItemFormat6" }));
                    }
                }

                //STANDARD FORMATS
                var StandardFormat1Thru6 = new List <string>();

                if (!string.IsNullOrWhiteSpace(ShippingProfile.StandardFormat1))
                {
                    StandardFormat1Thru6.Add(ShippingProfile.StandardFormat1);
                    if (ItemFormat1Thru6.Contains(ShippingProfile.StandardFormat1))
                    {
                        results.Add(new ValidationResult("Format cannot be selected as both Standard and Item Format.", new[] { "StandardFormat1" }));
                    }
                }

                if (!string.IsNullOrWhiteSpace(ShippingProfile.StandardFormat2))
                {
                    StandardFormat1Thru6.Add(ShippingProfile.StandardFormat2);
                    if (StandardFormat1Thru6.Distinct().Count() != StandardFormat1Thru6.Count())
                    {
                        results.Add(new ValidationResult("Standard Formats cannot be selected more than once.", new[] { "StandardFormat2" }));
                    }
                    if (ItemFormat1Thru6.Contains(ShippingProfile.StandardFormat2))
                    {
                        results.Add(new ValidationResult("Format cannot be selected as both Standard and Item Format.", new[] { "StandardFormat2" }));
                    }
                }

                if (!string.IsNullOrWhiteSpace(ShippingProfile.StandardFormat3))
                {
                    StandardFormat1Thru6.Add(ShippingProfile.StandardFormat3);
                    if (StandardFormat1Thru6.Distinct().Count() != StandardFormat1Thru6.Count())
                    {
                        results.Add(new ValidationResult("Standard Formats cannot be selected more than once.", new[] { "StandardFormat3" }));
                    }
                    if (ItemFormat1Thru6.Contains(ShippingProfile.StandardFormat3))
                    {
                        results.Add(new ValidationResult("Format cannot be selected as both Standard and Item Format.", new[] { "StandardFormat3" }));
                    }
                }

                if (!string.IsNullOrWhiteSpace(ShippingProfile.StandardFormat4))
                {
                    StandardFormat1Thru6.Add(ShippingProfile.StandardFormat4);
                    if (StandardFormat1Thru6.Distinct().Count() != StandardFormat1Thru6.Count())
                    {
                        results.Add(new ValidationResult("Standard Formats cannot be selected more than once.", new[] { "StandardFormat4" }));
                    }
                    if (ItemFormat1Thru6.Contains(ShippingProfile.StandardFormat4))
                    {
                        results.Add(new ValidationResult("Format cannot be selected as both Standard and Item Format.", new[] { "StandardFormat4" }));
                    }
                }

                if (!string.IsNullOrWhiteSpace(ShippingProfile.StandardFormat5))
                {
                    StandardFormat1Thru6.Add(ShippingProfile.StandardFormat5);
                    if (StandardFormat1Thru6.Distinct().Count() != StandardFormat1Thru6.Count())
                    {
                        results.Add(new ValidationResult("Standard Formats cannot be selected more than once.", new[] { "StandardFormat5" }));
                    }
                    if (ItemFormat1Thru6.Contains(ShippingProfile.StandardFormat5))
                    {
                        results.Add(new ValidationResult("Format cannot be selected as both Standard and Item Format.", new[] { "StandardFormat5" }));
                    }
                }

                if (!string.IsNullOrWhiteSpace(ShippingProfile.StandardFormat6))
                {
                    StandardFormat1Thru6.Add(ShippingProfile.StandardFormat6);
                    if (StandardFormat1Thru6.Distinct().Count() != StandardFormat1Thru6.Count())
                    {
                        results.Add(new ValidationResult("Standard Formats cannot be selected more than once.", new[] { "StandardFormat6" }));
                    }
                    if (ItemFormat1Thru6.Contains(ShippingProfile.StandardFormat6))
                    {
                        results.Add(new ValidationResult("Format cannot be selected as both Standard and Item Format.", new[] { "StandardFormat6" }));
                    }
                }

                //RATE CLASS
                if (ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.Institution) &&
                    ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.Individual))
                {
                    results.Add(new ValidationResult("Individual and Institution are mutually exclusive.", new[] { "RateClass" }));
                }

                if (ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.RegularEducator) &&
                    ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.SpecialEducator))
                {
                    results.Add(new ValidationResult("Special Educator and Regular Educator are mutually exclusive.", new[] { "RateClass" }));
                }

                if (ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.RegularProfessional) &&
                    ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.SpecialProfessional))
                {
                    results.Add(new ValidationResult("Special Professional and Regular Professional are mutually exclusive.", new[] { "RateClass" }));
                }

                if ((ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.RegularEducator) ||
                     ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.SpecialEducator)) &&
                    (ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.RegularProfessional) ||
                     ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.SpecialProfessional) ||
                     ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.Field) ||
                     ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.Military)))
                {
                    results.Add(new ValidationResult("Rate Class selection is mutually exclusive.", new[] { "RateClass" }));
                }

                if ((ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.RegularProfessional) ||
                     ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.SpecialProfessional)) &&
                    (ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.SpecialEducator) ||
                     ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.RegularEducator) ||
                     ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.Field) ||
                     ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.Military)))
                {
                    results.Add(new ValidationResult("Rate Class selection is mutually exclusive.", new[] { "RateClass" }));
                }

                if (ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.Field) &&
                    (ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.SpecialEducator) ||
                     ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.RegularEducator) ||
                     ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.Military) ||
                     ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.SpecialProfessional) ||
                     ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.RegularProfessional)))
                {
                    results.Add(new ValidationResult("Rate Class selection is mutually exclusive.", new[] { "RateClass" }));
                }

                if (ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.Military) &&
                    (ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.SpecialEducator) ||
                     ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.RegularEducator) ||
                     ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.Field) ||
                     ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.SpecialProfessional) ||
                     ShippingProfile.RateClass.HasFlag(ShippingProfile.RateClassEnum.RegularProfessional)))
                {
                    results.Add(new ValidationResult("Rate Class selection is mutually exclusive.", new[] { "RateClass" }));
                }


                #region Postage
                if (featureConfig.IsAvailable(FeaturesEnum.AddJetsDropAddress))
                {
                    if (!string.IsNullOrEmpty(ShippingProfile.Postage))
                    {
                        string countryCode = CountryCode;
                        bool   isAlternateShippingAddress = false;

                        if (JetsAddress != null)
                        {
                            countryCode = JetsAddress.CountryCode;
                            isAlternateShippingAddress = true;
                        }
                        else if (DropAddress != null)
                        {
                            countryCode = DropAddress.CountryCode;
                            isAlternateShippingAddress = true;
                        }

                        if (ShippingProfile.Postage == " " && countryCode != "US")
                        {
                            results.Add(isAlternateShippingAddress
                                ? new ValidationResult("US postage may not be valid based on alternate shipping address.",
                                                       new[] { "Postage" })
                                : new ValidationResult("US postage may not be valid based on shipping address.",
                                                       new[] { "Postage" }));
                        }

                        if (ShippingProfile.Postage != " " && countryCode == "US")
                        {
                            results.Add(isAlternateShippingAddress
                                ? new ValidationResult("Postage must be US based on alternate shipping address.",
                                                       new[] { "Postage" })
                                : new ValidationResult("Postage must be US based on shipping address.",
                                                       new[] { "Postage" }));
                        }
                    }
                }
                #endregion
            }

            #region JetsAddress.JetsServiceChargePercent
            if (JetsAddress != null)
            {
                var accountLegacyMapping = LegacyMappings.FirstOrDefault(x => x.LegacySystemName == "Mainframe - Account");
                if (accountLegacyMapping != null)
                {
                    if ((JetsAddress.JetsServiceChargePercent > 0m) &&
                        (!new[] { "AU", "BA", "FB", "JA", "KO", "MX", "TW", "ZE", "ZF", "ZI", "ZJ", "ZN", "ZP", "ZQ", "ZR", "ZS", "ZT", "ZU", "ZV", "ZX", "ZY", "ZZ" }.Contains(accountLegacyMapping.LegacyIdentifier.Substring(0, 2))))
                    {
                        results.Add(new ValidationResult("JETS Service Charge Percent cannot be used for this office.", new[] { "JetsServiceChargePercent" }));
                    }
                }
            }
            #endregion

            if (results.Count > 0)
            {
                return(results);
            }


            IValidationRepository validator  = null;
            IRepository           repository = null;
            try
            {
                if (ServiceLocator.IsLocationProviderSet)
                {
                    try
                    {
                        validator  = ServiceLocator.Current.GetInstance <IValidationRepository>();
                        repository = ServiceLocator.Current.GetInstance(typeof(IRepository)) as IRepository;
                    }
                    catch (ActivationException) { }
                }



                //var context = new ValidationContext(Address, serviceProvider: null, items: null);
                //var result = Validator.TryValidateObject(Address, context, results, true);
                //if(!result)
                //    return results;

                //IRepository repository = null;
                ////IListLookupService lookupService = null;
                //if (ServiceLocator.IsLocationProviderSet)
                //    try
                //    {
                //        //repository = ServiceLocator.Current.GetInstance(typeof(IRepository)) as IRepository;
                //        //lookupService = ServiceLocator.Current.GetInstance(typeof(IListLookupService)) as IListLookupService;
                //    }
                //    catch (ActivationException)
                //    {
                //        //do nothing
                //    }

                /* validate the address using the tax service */
                if (validator != null)
                {
                    if (!validator.ValidateTaxAddress(this))
                    {
                        results.Add(new ValidationResult("Shipping Address is not tax compliant.  City and/or Postal Code are invalid for the selected Country.", new[] { "SystemAddress" }));
                    }
                }

                if (LegacyMappings.Any(x => x.LegacySystemName == LegacySystemNames.Subscriber.Name))
                {
                    if (MainframeAddressOverride == null)
                    {
                        if (LegacyMappings.Any(x => x.LegacySystemName == LegacySystemNames.Subscriber.Name))
                        {
                            if (repository != null)
                            {
                                var formatter        = new MainframeAddressFormatter(repository);
                                var convertedAddress = formatter.ConvertShippingAddress(this);
                                if (
                                    (convertedAddress.Name ?? string.Empty).Length > 30 ||
                                    (convertedAddress.Line1 ?? string.Empty).Length > 30 ||
                                    (convertedAddress.Line2 ?? string.Empty).Length > 30 ||
                                    (convertedAddress.Line3 ?? string.Empty).Length > 30 ||
                                    (convertedAddress.Line4 ?? string.Empty).Length > 30
                                    )
                                {
                                    results.Add(new ValidationResult("Shipping Address is not mainframe compliant. Please use Mainframe Override address."));
                                }
                            }
                        }
                    }
                    else
                    {
                        /* Check if the shipping address is mainframe compliant and still mainframe override address is provided  */
                        if (repository != null)
                        {
                            var formatter        = new MainframeAddressFormatter(repository);
                            var convertedAddress = formatter.ConvertShippingAddress(this);
                            if (
                                (convertedAddress.Name ?? string.Empty).Length <= 30 &&
                                (convertedAddress.Line1 ?? string.Empty).Length <= 30 &&
                                (convertedAddress.Line2 ?? string.Empty).Length <= 30 &&
                                (convertedAddress.Line3 ?? string.Empty).Length <= 30 &&
                                (convertedAddress.Line4 ?? string.Empty).Length <= 30
                                )
                            {
                                results.Add(new ValidationResult(
                                                "Shipping Address is mainframe compliant. Please remove Mainframe Override address."));
                                return(results);
                            }
                        }

                        var context = new ValidationContext(MainframeAddressOverride, serviceProvider: null, items: null);
                        Validator.TryValidateObject(MainframeAddressOverride, context, results, true);
                    }

                    if (TapeAddress != null)
                    {
                        var context = new ValidationContext(TapeAddress, serviceProvider: null, items: null);
                        Validator.TryValidateObject(TapeAddress, context, results, true);
                    }

                    if (JetsAddress != null)
                    {
                        var context = new ValidationContext(JetsAddress, serviceProvider: null, items: null);
                        Validator.TryValidateObject(JetsAddress, context, results, true);
                    }

                    if (DropAddress != null)
                    {
                        var context = new ValidationContext(DropAddress, serviceProvider: null, items: null);
                        Validator.TryValidateObject(DropAddress, context, results, true);
                    }

                    if (ShippingProfile != null)
                    {
                        var context = new ValidationContext(ShippingProfile, serviceProvider: null, items: null);
                        Validator.TryValidateObject(ShippingProfile, context, results, true);
                    }

                    if (LegacyMappings.Count > 0)
                    {
                        if (repository == null)
                        {
                            return(results);
                        }

                        var accountLegacyMapping = LegacyMappings.FirstOrDefault(x => x.LegacySystemName == LegacySystemNames.Account.Name);
                        if (accountLegacyMapping == null)
                        {
                            return(results);
                        }

                        var subcodeLegacyMapping = LegacyMappings.FirstOrDefault(x => x.LegacySystemName == LegacySystemNames.Subscriber.Name);

                        if (subcodeLegacyMapping != null)
                        {
                            if (subcodeLegacyMapping.LegacyIdentifier.Length < 10)
                            {
                                results.Add(new ValidationResult("Subscriber Mapping is not 2 character long.", new[] { "Subscriber Code" }));
                            }

                            var existingCustomer = repository.GetCustomer(CustomerId, RelatedEntitiesEnum.ShippingLocations);
                            foreach (var location in existingCustomer.ShippingLocations.Where(x => x.Id != Id && x.LegacyMappings.Any(alm => alm.Id == accountLegacyMapping.Id)))
                            {
                                if (location.LegacyMappings.Any(x => x.LegacySystemName == LegacySystemNames.Subscriber.Name && x.LegacyIdentifier == subcodeLegacyMapping.LegacyIdentifier))
                                {
                                    results.Add(new ValidationResult("Subscriber is already mapped to an existing address.", new[] { "Subscriber Code" }));
                                    break;
                                }
                            }

                            var countries = repository.GetCountries();
                            var country   = countries.FirstOrDefault(x => x.Value == CountryCode);
                            if (string.IsNullOrEmpty(country?.MainframeShortCode) && MainframeAddressOverride == null)
                            {
                                results.Add(new ValidationResult("Shipping Address is not mainframe compliant. Mainframe does not support the specified country.  Please use Mainframe Override Address."));
                            }
                        }
                    }

                    if (ShippingProfile != null)
                    {
                        if (!string.IsNullOrWhiteSpace(ShippingProfile.VATCountryCode) && !LegacyMappings[0].LegacyIdentifier.StartsWith("Z"))
                        {
                            results.Add(new ValidationResult("VAT Country Code cannot be selected for this office.", new[] { "VATCountryCode" }));
                        }
                    }

                    return(results);
                }
                else
                {
                    if (TapeAddress != null)
                    {
                        results.Add(new ValidationResult("Tape Address cannot be provided without a subscriber code.", new[] { "Tape Address" }));
                    }
                }
                return(results);
            }
            finally
            {
                validator?.Dispose();
                repository?.Dispose();
            }
        }