1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10:
11:
12: 13: 14:
15: class IllApps_Shipsync_Model_Shipping_Carrier_Fedex_Address extends IllApps_Shipsync_Model_Shipping_Carrier_Fedex
16: {
17:
18:
19: protected $_addressRequest;
20: protected $_addressResult;
21: protected $_addressResultError;
22: protected $_addressServiceClient;
23: protected $_addressServiceVersion = '2';
24: protected $_addressServiceWsdlPath = 'AddressValidationService_v2.wsdl';
25:
26:
27:
28: 29: 30: 31: 32: 33:
34: public function validate(Mage_Sales_Model_Quote_Address $request)
35: {
36: $this->_addressServiceClient = $this->_initWebServices($this->_addressServiceWsdlPath);
37:
38: $this->setAddressRequest($request);
39:
40: $this->_addressResult = $this->_validateAddress();
41:
42: return $this->_addressResult;
43: }
44:
45:
46:
47: 48: 49: 50: 51: 52:
53: public function setAddressRequest(Mage_Sales_Model_Quote_Address $request)
54: {
55:
56: foreach ($request->getStreet() as $street) {
57: if ($street != '') {
58: $streets[] = $street;
59: }
60: }
61:
62:
63: $request->setStreet($streets);
64:
65:
66: $this->_addressRequest = $request;
67:
68:
69: return $this;
70: }
71:
72:
73:
74: 75: 76: 77: 78:
79: public function getAddressResultError()
80: {
81:
82: if ($this->_addressResultError) {
83: return array(
84: Mage::helper('customer')->__($this->_addressResultError)
85: );
86: }
87:
88: return false;
89: }
90:
91:
92:
93: 94: 95: 96: 97: 98: 99:
100: public function getResidential($street, $postcode)
101: {
102: $addressServiceClient = $this->_initWebServices($this->_addressServiceWsdlPath);
103: $addressServiceVersion = $this->_addressServiceVersion;
104:
105: $request['WebAuthenticationDetail'] = array(
106: 'UserCredential' => array(
107: 'Key' => $this->getFedexKey(),
108: 'Password' => $this->getFedexPassword()
109: )
110: );
111:
112: $request['ClientDetail'] = array(
113: 'AccountNumber' => $this->getFedexAccount(),
114: 'MeterNumber' => $this->getFedexMeter()
115: );
116:
117: $request['TransactionDetail']['CustomerTransactionId'] = '*** Address Validation Request v' . $addressServiceVersion . ' Using PHP ***';
118:
119: $request['Version'] = array(
120: 'ServiceId' => 'aval',
121: 'Major' => $addressServiceVersion,
122: 'Intermediate' => '0',
123: 'Minor' => '0'
124: );
125:
126: $request['RequestTimestamp'] = date('c');
127:
128: $request['Options'] = array(
129: 'CheckResidentialStatus' => 1,
130: 'MaximumNumberOfMatches' => 1,
131: 'StreetAccuracy' => 'LOOSE',
132: 'DirectionalAccuracy' => 'LOOSE',
133: 'CompanyNameAccuracy' => 'LOOSE',
134: 'ConvertToUpperCase' => 1,
135: 'RecognizeAlternateCityNames' => 1,
136: 'ReturnParsedElements' => 1
137: );
138:
139: $request['AddressesToValidate'] = array(
140: 0 => array(
141: 'AddressId' => 'Destination',
142: 'Address' => array(
143: 'StreetLines' => $street,
144: 'PostalCode' => $postcode,
145: 'CountryCode' => 'US'
146: )
147: )
148: );
149:
150: try {
151: Mage::Helper('shipsync')->mageLog($request, 'address');
152: $response = $addressServiceClient->addressValidation($request);
153: Mage::Helper('shipsync')->mageLog($response, 'address');
154: }
155: catch (SoapFault $ex) {
156: $this->_addressResultError = $ex->getMessage();
157: }
158:
159: if (isset($response->AddressResults->ProposedAddressDetails->DeliveryPointValidation) && $response->AddressResults->ProposedAddressDetails->DeliveryPointValidation == 'CONFIRMED') {
160: if ($response->AddressResults->ProposedAddressDetails->ResidentialStatus == 'RESIDENTIAL') {
161: return true;
162: }
163:
164: return false;
165: } else {
166: return true;
167: }
168: }
169:
170:
171: 172: 173: 174: 175: 176:
177: public function isPostOfficeBox($street)
178: {
179: if (preg_match('/^(POB\s+|P\s*O\s*Box|Post Office Box|Postal Box|Box|Boite Postal)\s*[0-9a-z]+(-[0-9a-z]+)*/i', (string) $street)) {
180: return true;
181: }
182: return false;
183: }
184:
185:
186:
187: 188: 189: 190: 191:
192: protected function _validateAddress()
193: {
194: return $this->validateAddress();
195: }
196:
197:
198:
199: 200: 201: 202: 203:
204: public function validateAddress()
205: {
206: $addressRequest = $this->_addressRequest;
207: $addressServiceClient = $this->_addressServiceClient;
208: $addressServiceVersion = $this->_addressServiceVersion;
209:
210: $request['WebAuthenticationDetail'] = array(
211: 'UserCredential' => array(
212: 'Key' => $this->getFedexKey(),
213: 'Password' => $this->getFedexPassword()
214: )
215: );
216:
217: $request['ClientDetail'] = array(
218: 'AccountNumber' => $this->getFedexAccount(),
219: 'MeterNumber' => $this->getFedexMeter()
220: );
221:
222: $request['TransactionDetail']['CustomerTransactionId'] = '*** Address Validation Request v' . $addressServiceVersion . ' Using PHP ***';
223:
224: $request['Version'] = array(
225: 'ServiceId' => 'aval',
226: 'Major' => $addressServiceVersion,
227: 'Intermediate' => '0',
228: 'Minor' => '0'
229: );
230:
231: $request['RequestTimestamp'] = date('c');
232:
233: $request['Options'] = array(
234: 'CheckResidentialStatus' => 1,
235: 'MaximumNumberOfMatches' => 5,
236: 'StreetAccuracy' => 'LOOSE',
237: 'DirectionalAccuracy' => 'LOOSE',
238: 'CompanyNameAccuracy' => 'LOOSE',
239: 'ConvertToUpperCase' => 1,
240: 'RecognizeAlternateCityNames' => 1,
241: 'ReturnParsedElements' => 1
242: );
243:
244: $request['AddressesToValidate'] = array(
245: 0 => array(
246: 'AddressId' => 'Destination',
247: 'Address' => array(
248: 'StreetLines' => $addressRequest->getStreet(),
249: 'City' => $addressRequest->getCity(),
250: 'StateOrProvinceCode' => $addressRequest->getRegionCode(),
251: 'CountryCode' => $addressRequest->getCountryCode(),
252: 'PostalCode' => $addressRequest->getPostcode()
253: )
254: )
255: );
256:
257: try {
258: Mage::Helper('shipsync')->mageLog($request, 'address');
259: $response = $addressServiceClient->addressValidation($request);
260: Mage::Helper('shipsync')->mageLog($response, 'address');
261: }
262: catch (SoapFault $ex) {
263: $this->_addressResultError = $ex->getMessage();
264: }
265:
266: return $this->_parseWsdlResponse($response);
267: }
268:
269:
270:
271: 272: 273: 274: 275: 276:
277: protected function _parseWsdlResponse($response)
278: {
279: $addressResult = $this->_addressRequest;
280:
281: if ($response->HighestSeverity == 'ERROR' || $response->HighestSeverity == 'FAILURE') {
282: $errorMsg = '';
283:
284: if (is_array($response->Notifications)) {
285: foreach ($response->Notifications as $notification) {
286: $errorMsg .= $notification->Severity . ': ' . $notification->Message . '<br />';
287: }
288: } elseif (($response->Notifications->Message == 'General Error') && Mage::getStoreConfig('carriers/fedex/test_mode')) {
289: $errorMsg .= 'ERROR: FedEx Testing servers are temporarily unavailable. Please try again in a few moments.<br />';
290: } else {
291: $errorMsg .= $response->Notifications->Severity . ': ' . $response->Notifications->Message . '<br />';
292: }
293:
294: $this->_addressResultError = $errorMsg;
295:
296: return true;
297: } elseif (is_array($response->AddressResults->ProposedAddressDetails)) {
298: $address = "";
299:
300: foreach ($response->AddressResults->ProposedAddressDetails as $detail) {
301: $address .= $detail->Address->StreetLines . "\n" . $detail->Address->City . ", " . $detail->Address->StateOrProvinceCode . " " . $detail->ParsedAddress->ParsedPostalCode->Elements[0]->Value . "\n\n";
302: }
303:
304: $this->_addressResultError = "We're sorry, but your address was not found. However, we found a few close matches :\n\n" . $address . "Please correct your address and resubmit.";
305: } elseif ($response->AddressResults->ProposedAddressDetails->DeliveryPointValidation == 'CONFIRMED') {
306: if (is_array($response->AddressResults->ProposedAddressDetails->ParsedAddress->ParsedPostalCode->Elements)) {
307: $postcode = $response->AddressResults->ProposedAddressDetails->ParsedAddress->ParsedPostalCode->Elements[0]->Value;
308: } else {
309: $postcode = $response->AddressResults->ProposedAddressDetails->ParsedAddress->ParsedPostalCode->Elements->Value;
310: }
311:
312: $addressResult->setStreet($response->AddressResults->ProposedAddressDetails->Address->StreetLines);
313: $addressResult->setCity($response->AddressResults->ProposedAddressDetails->Address->City);
314: $addressResult->setPostcode($postcode);
315: $addressResult->setCountryId($response->AddressResults->ProposedAddressDetails->Address->CountryCode);
316: $addressResult->setRegionCode($response->AddressResults->ProposedAddressDetails->Address->StateOrProvinceCode);
317: } elseif ($response->AddressResults->ProposedAddressDetails->DeliveryPointValidation == 'UNCONFIRMED' && $response->AddressResults->ProposedAddressDetails->ResidentialStatus == 'INSUFFICIENT_DATA') {
318: if (is_array($response->AddressResults->ProposedAddressDetails->ParsedAddress->ParsedPostalCode->Elements)) {
319: $postcode = $response->AddressResults->ProposedAddressDetails->ParsedAddress->ParsedPostalCode->Elements[0]->Value;
320: } else {
321: $postcode = $response->AddressResults->ProposedAddressDetails->ParsedAddress->ParsedPostalCode->Elements->Value;
322: }
323:
324: $addressResult->setStreet($response->AddressResults->ProposedAddressDetails->Address->StreetLines);
325: $addressResult->setCity($response->AddressResults->ProposedAddressDetails->Address->City);
326: $addressResult->setPostcode($postcode);
327: $addressResult->setCountryId($response->AddressResults->ProposedAddressDetails->Address->CountryCode);
328: $addressResult->setRegionCode($response->AddressResults->ProposedAddressDetails->Address->StateOrProvinceCode);
329: } else {
330: $this->_addressResultError = 'Invalid address. Please check to make sure it is correct and try again.';
331: }
332:
333: return $addressResult;
334: }
335:
336: }
337: