/**
  * Sends the AddressValidationRequest and returns the response
  *
  * @param ComplexType\AddressValidationRequest $addressValidationRequest 
  * @return stdClass
  */
 public function getAddressValidationReply(ComplexType\AddressValidationRequest $addressValidationRequest)
 {
     return $this->_soapClient->addressValidation($addressValidationRequest->toArray());
 }
 public function residential_address_validation($package)
 {
     $residential = $this->residential;
     // Address Validation API only available for production
     if ($this->production) {
         // Check if address is residential or commerical
         try {
             $client = new SoapClient(plugin_dir_path(dirname(__FILE__)) . 'fedex-wsdl/production/AddressValidationService_v' . $this->addressvalidationservice_version . '.wsdl', array('trace' => 1));
             $request = array();
             $request['WebAuthenticationDetail'] = array('UserCredential' => array('Key' => $this->api_key, 'Password' => $this->api_pass));
             $request['ClientDetail'] = array('AccountNumber' => $this->account_number, 'MeterNumber' => $this->meter_number);
             $request['TransactionDetail'] = array('CustomerTransactionId' => ' *** Address Validation Request v2 from WooCommerce ***');
             $request['Version'] = array('ServiceId' => 'aval', 'Major' => $this->addressvalidationservice_version, 'Intermediate' => '0', 'Minor' => '0');
             $request['RequestTimestamp'] = date('c');
             $request['Options'] = array('CheckResidentialStatus' => 1, 'MaximumNumberOfMatches' => 1, 'StreetAccuracy' => 'LOOSE', 'DirectionalAccuracy' => 'LOOSE', 'CompanyNameAccuracy' => 'LOOSE', 'ConvertToUpperCase' => 1, 'RecognizeAlternateCityNames' => 1, 'ReturnParsedElements' => 1);
             $request['AddressesToValidate'] = array(0 => array('AddressId' => 'WTC', 'Address' => array('StreetLines' => array($package['destination']['address'], $package['destination']['address_2']), 'PostalCode' => $package['destination']['postcode'])));
             $response = $client->addressValidation($request);
             if ($response->HighestSeverity == 'SUCCESS') {
                 if (is_array($response->AddressResults)) {
                     $addressResult = $response->AddressResults[0];
                 } else {
                     $addressResult = $response->AddressResults;
                 }
                 if ($addressResult->ProposedAddressDetails->ResidentialStatus == 'BUSINESS') {
                     $residential = false;
                 } elseif ($addressResult->ProposedAddressDetails->ResidentialStatus == 'RESIDENTIAL') {
                     $residential = true;
                 }
             }
         } catch (Exception $e) {
         }
     }
     $this->residential = apply_filters('woocommerce_fedex_address_type', $residential, $package);
     if ($this->residential == false) {
         $this->debug(__('Business Address', 'wf-shipping-fedex'));
     }
 }
 /**
  * get_package_requests function.
  *
  * @access private
  * @return void
  */
 private function get_package_requests($package)
 {
     $requests = array();
     $residential = true;
     // Address Validation API only available for production
     if ($this->production) {
         // Check if address is residential or commerical
         try {
             $client = new SoapClient(plugin_dir_path(dirname(__FILE__)) . 'api/production/AddressValidationService_v' . $this->addressvalidationservice_version . '.wsdl', array('trace' => 1));
             $request = array();
             $request['WebAuthenticationDetail'] = array('UserCredential' => array('Key' => $this->api_key, 'Password' => $this->api_pass));
             $request['ClientDetail'] = array('AccountNumber' => $this->account_number, 'MeterNumber' => $this->meter_number);
             $request['TransactionDetail'] = array('CustomerTransactionId' => ' *** Address Validation Request v2 from WooCommerce ***');
             $request['Version'] = array('ServiceId' => 'aval', 'Major' => $this->addressvalidationservice_version, 'Intermediate' => '0', 'Minor' => '0');
             $request['RequestTimestamp'] = date('c');
             $request['Options'] = array('CheckResidentialStatus' => 1, 'MaximumNumberOfMatches' => 1, 'StreetAccuracy' => 'LOOSE', 'DirectionalAccuracy' => 'LOOSE', 'CompanyNameAccuracy' => 'LOOSE', 'ConvertToUpperCase' => 1, 'RecognizeAlternateCityNames' => 1, 'ReturnParsedElements' => 1);
             $request['AddressesToValidate'] = array(0 => array('AddressId' => 'WTC', 'Address' => array('StreetLines' => array($package['destination']['address'], $package['destination']['address_2']), 'PostalCode' => $package['destination']['postcode'])));
             $response = $client->addressValidation($request);
             if ($response->HighestSeverity != 'FAILURE' && $response->HighestSeverity != 'ERROR') {
                 foreach ($response->AddressResults as $addressResult) {
                     if ($addressResult->ProposedAddressDetails->ResidentialStatus == 'BUSINESS') {
                         $residential = false;
                     }
                 }
             }
         } catch (Exception $e) {
         }
     }
     $residential = apply_filters('woocommerce_fedex_address_type', $residential, $package);
     if ($this->debug && $residential == false) {
         $woocommerce->add_message(__('Business Address', 'wc_fedex'));
     }
     // All reguests for this package get this data
     $package_request = $this->get_request($package);
     $package_request['RequestedShipment']['Recipient'] = array('Address' => array('Residential' => $residential, 'PostalCode' => str_replace(' ', '', strtoupper($package['destination']['postcode'])), 'CountryCode' => $package['destination']['country']));
     // Add state to US/Canadian requests
     if (in_array($package['destination']['country'], array('US', 'CA'))) {
         $package_request['RequestedShipment']['Recipient']['Address']['StateOrProvinceCode'] = $package['destination']['state'];
     }
     // Choose selected packing
     switch ($this->packing_method) {
         case 'box_packing':
             $parcels = $this->box_shipping($package);
             break;
         case 'per_item':
         default:
             $parcels = $this->per_item_shipping($package);
             break;
     }
     if ($parcels) {
         // Max 99
         $parcel_chunks = array_chunk($parcels, 99);
         foreach ($parcel_chunks as $parcels) {
             // Make request
             $request = $package_request;
             // Store value
             $total_value = 0;
             $total_packages = 0;
             // Store parcels as lin items
             $request['RequestedShipment']['RequestedPackageLineItems'] = array();
             foreach ($parcels as $key => $parcel) {
                 $total_value += $parcel['InsuredValue']['Amount'];
                 $total_packages += $parcel['GroupPackageCount'];
                 if (!$this->insure_contents) {
                     unset($parcel['InsuredValue']);
                 }
                 $parcel = array_merge(array('SequenceNumber' => $key + 1), $parcel);
                 $request['RequestedShipment']['RequestedPackageLineItems'][] = $parcel;
             }
             // Add insurance
             if ($this->insure_contents) {
                 $request['RequestedShipment']['TotalInsuredValue'] = array('Amount' => round($total_value), 'Currency' => get_woocommerce_currency());
             }
             // Size
             $request['RequestedShipment']['PackageCount'] = $total_packages;
             $requests[] = $request;
         }
     }
     return $requests;
 }