/// <summary> /// Validates the address as well as resolves the state from zip code, if needed. /// </summary> /// <param name="context">Instance of <see cref="RequestContext"/>.</param> /// <param name="addressToValidate">Address to be validated and resolved.</param> /// <param name="validationFailures">The list to hold all exceptions.</param> private static void ValidateAndResolveAddress(RequestContext context, Address addressToValidate, List <DataValidationFailure> validationFailures) { if (addressToValidate != null) { // Validates the address ValidateAddressDataRequest validateAddressRequest = new ValidateAddressDataRequest(addressToValidate); ValidateAddressDataResponse response = context.Runtime.Execute <ValidateAddressDataResponse>(validateAddressRequest, context); if (!response.IsAddressValid) { validationFailures.Add(new DataValidationFailure(response.ErrorCode, new Collection <string> { response.InvalidAddressComponentName }, response.ErrorMessage)); return; } // If zip code is provided but not the state, resolve the state from zipcode. if (string.IsNullOrWhiteSpace(addressToValidate.State) && !string.IsNullOrWhiteSpace(addressToValidate.ZipCode)) { GetFromZipPostalCodeServiceRequest zipPostalCodeRequest = new GetFromZipPostalCodeServiceRequest(addressToValidate.ThreeLetterISORegionName, addressToValidate.ZipCode) { QueryResultSettings = QueryResultSettings.AllRecords }; GetFromZipPostalCodeServiceResponse zipPostalCodeResponse = context.Runtime.Execute <GetFromZipPostalCodeServiceResponse>(zipPostalCodeRequest, context); if (zipPostalCodeResponse.Results != null) { ZipCodeInfo zipCodeResult = zipPostalCodeResponse.Results.Results.GetEnumerator().Current; if (zipCodeResult != null) { addressToValidate.State = zipCodeResult.StateId; } } } } }
/// <summary> /// Validate customer addresses. /// </summary> /// <param name="context">The request context.</param> /// <param name="customerAddresses">The customer addresses.</param> internal static void ValidateAddresses(RequestContext context, IEnumerable <Address> customerAddresses) { ThrowIf.Null(context, "context"); ThrowIf.Null(customerAddresses, "customerAddresses"); Collection <DataValidationFailure> validationFailures = new Collection <DataValidationFailure>(); foreach (Address customerAddress in customerAddresses) { // don't validate those addresses that are selected for deactivation/delete if (customerAddress.Deactivate) { continue; } // don't validate if this address is empty and the recid=0 if (customerAddress.IsEmpty() && customerAddress.RecordId == 0) { continue; } // Validates the address ValidateAddressDataRequest validateAddressRequest = new ValidateAddressDataRequest(customerAddress); ValidateAddressDataResponse response = context.Execute <ValidateAddressDataResponse>(validateAddressRequest); if (!response.IsAddressValid) { validationFailures.Add(new DataValidationFailure(DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_InvalidAddress, response.InvalidAddressComponentName)); } } if (validationFailures.Any()) { throw new DataValidationException(DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_AggregateValidationError, validationFailures, "Customer address validation failures."); } }