fedex.php (11167B)
1 <?php 2 class ModelExtensionShippingFedex extends Model { 3 function getQuote($address) { 4 $this->load->language('extension/shipping/fedex'); 5 6 $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "zone_to_geo_zone WHERE geo_zone_id = '" . (int)$this->config->get('shipping_fedex_geo_zone_id') . "' AND country_id = '" . (int)$address['country_id'] . "' AND (zone_id = '" . (int)$address['zone_id'] . "' OR zone_id = '0')"); 7 8 if (!$this->config->get('shipping_fedex_geo_zone_id')) { 9 $status = true; 10 } elseif ($query->num_rows) { 11 $status = true; 12 } else { 13 $status = false; 14 } 15 16 $error = ''; 17 18 $quote_data = array(); 19 20 if ($status) { 21 $weight = $this->weight->convert($this->cart->getWeight(), $this->config->get('config_weight_class_id'), $this->config->get('shipping_fedex_weight_class_id')); 22 $weight_code = strtoupper($this->weight->getUnit($this->config->get('shipping_fedex_weight_class_id'))); 23 24 if ($weight_code == 'KGS') { 25 $weight_code = 'KG'; 26 } 27 28 if ($weight_code == 'LBS') { 29 $weight_code = 'LB'; 30 } 31 32 $date = time(); 33 34 $day = date('l', $date); 35 36 if ($day == 'Saturday') { 37 $date += 172800; 38 } elseif ($day == 'Sunday') { 39 $date += 86400; 40 } 41 42 $this->load->model('localisation/country'); 43 44 $country_info = $this->model_localisation_country->getCountry($this->config->get('config_country_id')); 45 46 $this->load->model('localisation/zone'); 47 48 $zone_info = $this->model_localisation_zone->getZone($this->config->get('config_zone_id')); 49 50 if (!$this->config->get('shipping_fedex_test')) { 51 $url = 'https://gateway.fedex.com/web-services/'; 52 } else { 53 $url = 'https://gatewaybeta.fedex.com/web-services/'; 54 } 55 56 // Whoever introduced xml to shipping companies should be flogged 57 $xml = '<?xml version="1.0"?>'; 58 $xml .= '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://fedex.com/ws/rate/v10">'; 59 $xml .= ' <SOAP-ENV:Body>'; 60 $xml .= ' <ns1:RateRequest>'; 61 $xml .= ' <ns1:WebAuthenticationDetail>'; 62 $xml .= ' <ns1:UserCredential>'; 63 $xml .= ' <ns1:Key>' . $this->config->get('shipping_fedex_key') . '</ns1:Key>'; 64 $xml .= ' <ns1:Password>' . $this->config->get('shipping_fedex_password') . '</ns1:Password>'; 65 $xml .= ' </ns1:UserCredential>'; 66 $xml .= ' </ns1:WebAuthenticationDetail>'; 67 $xml .= ' <ns1:ClientDetail>'; 68 $xml .= ' <ns1:AccountNumber>' . $this->config->get('shipping_fedex_account') . '</ns1:AccountNumber>'; 69 $xml .= ' <ns1:MeterNumber>' . $this->config->get('shipping_fedex_meter') . '</ns1:MeterNumber>'; 70 $xml .= ' </ns1:ClientDetail>'; 71 $xml .= ' <ns1:Version>'; 72 $xml .= ' <ns1:ServiceId>crs</ns1:ServiceId>'; 73 $xml .= ' <ns1:Major>10</ns1:Major>'; 74 $xml .= ' <ns1:Intermediate>0</ns1:Intermediate>'; 75 $xml .= ' <ns1:Minor>0</ns1:Minor>'; 76 $xml .= ' </ns1:Version>'; 77 $xml .= ' <ns1:ReturnTransitAndCommit>true</ns1:ReturnTransitAndCommit>'; 78 $xml .= ' <ns1:RequestedShipment>'; 79 $xml .= ' <ns1:ShipTimestamp>' . date('c', $date) . '</ns1:ShipTimestamp>'; 80 $xml .= ' <ns1:DropoffType>' . $this->config->get('shipping_fedex_dropoff_type') . '</ns1:DropoffType>'; 81 $xml .= ' <ns1:PackagingType>' . $this->config->get('shipping_fedex_packaging_type') . '</ns1:PackagingType>'; 82 $xml .= ' <ns1:Shipper>'; 83 $xml .= ' <ns1:Contact>'; 84 $xml .= ' <ns1:PersonName>' . $this->config->get('config_owner') . '</ns1:PersonName>'; 85 $xml .= ' <ns1:CompanyName>' . $this->config->get('config_name') . '</ns1:CompanyName>'; 86 $xml .= ' <ns1:PhoneNumber>' . $this->config->get('config_telephone') . '</ns1:PhoneNumber>'; 87 $xml .= ' </ns1:Contact>'; 88 $xml .= ' <ns1:Address>'; 89 90 if (in_array($country_info['iso_code_2'], array('US', 'CA'))) { 91 $xml .= ' <ns1:StateOrProvinceCode>' . ($zone_info ? $zone_info['code'] : '') . '</ns1:StateOrProvinceCode>'; 92 } else { 93 $xml .= ' <ns1:StateOrProvinceCode></ns1:StateOrProvinceCode>'; 94 } 95 96 $xml .= ' <ns1:PostalCode>' . $this->config->get('shipping_fedex_postcode') . '</ns1:PostalCode>'; 97 $xml .= ' <ns1:CountryCode>' . $country_info['iso_code_2'] . '</ns1:CountryCode>'; 98 $xml .= ' </ns1:Address>'; 99 $xml .= ' </ns1:Shipper>'; 100 101 $xml .= ' <ns1:Recipient>'; 102 $xml .= ' <ns1:Contact>'; 103 $xml .= ' <ns1:PersonName>' . $address['firstname'] . ' ' . $address['lastname'] . '</ns1:PersonName>'; 104 $xml .= ' <ns1:CompanyName>' . $address['company'] . '</ns1:CompanyName>'; 105 $xml .= ' <ns1:PhoneNumber>' . $this->customer->getTelephone() . '</ns1:PhoneNumber>'; 106 $xml .= ' </ns1:Contact>'; 107 $xml .= ' <ns1:Address>'; 108 $xml .= ' <ns1:StreetLines>' . $address['address_1'] . '</ns1:StreetLines>'; 109 $xml .= ' <ns1:City>' . $address['city'] . '</ns1:City>'; 110 111 if (in_array($address['iso_code_2'], array('US', 'CA'))) { 112 $xml .= ' <ns1:StateOrProvinceCode>' . $address['zone_code'] . '</ns1:StateOrProvinceCode>'; 113 } else { 114 $xml .= ' <ns1:StateOrProvinceCode></ns1:StateOrProvinceCode>'; 115 } 116 117 $xml .= ' <ns1:PostalCode>' . $address['postcode'] . '</ns1:PostalCode>'; 118 $xml .= ' <ns1:CountryCode>' . $address['iso_code_2'] . '</ns1:CountryCode>'; 119 $xml .= ' <ns1:Residential>' . ($address['company'] ? 'true' : 'false') . '</ns1:Residential>'; 120 $xml .= ' </ns1:Address>'; 121 $xml .= ' </ns1:Recipient>'; 122 $xml .= ' <ns1:ShippingChargesPayment>'; 123 $xml .= ' <ns1:PaymentType>SENDER</ns1:PaymentType>'; 124 $xml .= ' <ns1:Payor>'; 125 $xml .= ' <ns1:AccountNumber>' . $this->config->get('shipping_fedex_account') . '</ns1:AccountNumber>'; 126 $xml .= ' <ns1:CountryCode>' . $country_info['iso_code_2'] . '</ns1:CountryCode>'; 127 $xml .= ' </ns1:Payor>'; 128 $xml .= ' </ns1:ShippingChargesPayment>'; 129 $xml .= ' <ns1:RateRequestTypes>' . $this->config->get('shipping_fedex_rate_type') . '</ns1:RateRequestTypes>'; 130 $xml .= ' <ns1:PackageCount>1</ns1:PackageCount>'; 131 $xml .= ' <ns1:RequestedPackageLineItems>'; 132 $xml .= ' <ns1:SequenceNumber>1</ns1:SequenceNumber>'; 133 $xml .= ' <ns1:GroupPackageCount>1</ns1:GroupPackageCount>'; 134 $xml .= ' <ns1:Weight>'; 135 $xml .= ' <ns1:Units>' . $weight_code . '</ns1:Units>'; 136 $xml .= ' <ns1:Value>' . $weight . '</ns1:Value>'; 137 $xml .= ' </ns1:Weight>'; 138 $xml .= ' <ns1:Dimensions>'; 139 $xml .= ' <ns1:Length>' . $this->config->get('shipping_fedex_length') . '</ns1:Length>'; 140 $xml .= ' <ns1:Width>' . $this->config->get('shipping_fedex_width') . '</ns1:Width>'; 141 $xml .= ' <ns1:Height>' . $this->config->get('shipping_fedex_height') . '</ns1:Height>'; 142 $xml .= ' <ns1:Units>' . strtoupper($this->length->getUnit($this->config->get('shipping_fedex_length_class_id'))) . '</ns1:Units>'; 143 $xml .= ' </ns1:Dimensions>'; 144 $xml .= ' </ns1:RequestedPackageLineItems>'; 145 $xml .= ' </ns1:RequestedShipment>'; 146 $xml .= ' </ns1:RateRequest>'; 147 $xml .= ' </SOAP-ENV:Body>'; 148 $xml .= '</SOAP-ENV:Envelope>'; 149 150 $curl = curl_init($url); 151 152 curl_setopt($curl, CURLOPT_POST, true); 153 curl_setopt($curl, CURLOPT_POSTFIELDS, $xml); 154 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 155 curl_setopt($curl, CURLOPT_HEADER, false); 156 curl_setopt($curl, CURLOPT_TIMEOUT, 30); 157 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 158 159 $response = curl_exec($curl); 160 161 curl_close($curl); 162 163 $dom = new DOMDocument('1.0', 'UTF-8'); 164 $dom->loadXml($response); 165 166 if ($dom->getElementsByTagName('faultcode')->length > 0) { 167 $error = $dom->getElementsByTagName('cause')->item(0)->nodeValue; 168 169 $this->log->write('FEDEX :: ' . $response); 170 } elseif ($dom->getElementsByTagName('HighestSeverity')->item(0)->nodeValue == 'FAILURE' || $dom->getElementsByTagName('HighestSeverity')->item(0)->nodeValue == 'ERROR') { 171 $error = $dom->getElementsByTagName('HighestSeverity')->item(0)->nodeValue; 172 173 $this->log->write('FEDEX :: ' . $response); 174 } else { 175 $rate_reply_details = $dom->getElementsByTagName('RateReplyDetails'); 176 177 foreach ($rate_reply_details as $rate_reply_detail) { 178 $code = strtolower($rate_reply_detail->getElementsByTagName('ServiceType')->item(0)->nodeValue); 179 180 if (in_array(strtoupper($code), $this->config->get('shipping_fedex_service'))) { 181 $title = $this->language->get('text_' . $code); 182 183 $delivery_time_stamp = $rate_reply_detail->getElementsByTagName('DeliveryTimestamp'); 184 185 if ($this->config->get('shipping_fedex_display_time') && $delivery_time_stamp->length) { 186 $title .= ' (' . $this->language->get('text_eta') . ' ' . date($this->language->get('date_format_short') . ' ' . $this->language->get('time_format'), strtotime($delivery_time_stamp->item(0)->nodeValue)) . ')'; 187 } 188 189 $rated_shipment_details = $rate_reply_detail->getElementsByTagName('RatedShipmentDetails'); 190 191 foreach ($rated_shipment_details as $rated_shipment_detail) { 192 $shipment_rate_detail = $rated_shipment_detail->getElementsByTagName('ShipmentRateDetail')->item(0); 193 $shipment_rate_detail_type = explode('_', $shipment_rate_detail->getElementsByTagName('RateType')->item(0)->nodeValue); 194 195 if (count($shipment_rate_detail_type) == 3 && $shipment_rate_detail_type[1] == $this->config->get('shipping_fedex_rate_type')) { 196 $total_net_charge = $shipment_rate_detail->getElementsByTagName('TotalNetCharge')->item(0); 197 198 break; 199 } 200 } 201 202 $cost = $total_net_charge->getElementsByTagName('Amount')->item(0)->nodeValue; 203 204 $currency = $total_net_charge->getElementsByTagName('Currency')->item(0)->nodeValue; 205 206 $quote_data[$code] = array( 207 'code' => 'fedex.' . $code, 208 'title' => $title, 209 'cost' => $this->currency->convert($cost, $currency, $this->config->get('config_currency')), 210 'tax_class_id' => $this->config->get('shipping_fedex_tax_class_id'), 211 'text' => $this->currency->format($this->tax->calculate($this->currency->convert($cost, $currency, $this->session->data['currency']), $this->config->get('shipping_fedex_tax_class_id'), $this->config->get('config_tax')), $this->session->data['currency'], 1.0000000) 212 ); 213 } 214 } 215 } 216 } 217 218 $method_data = array(); 219 220 if ($quote_data || $error) { 221 $title = $this->language->get('text_title'); 222 223 if ($this->config->get('shipping_fedex_display_weight')) { 224 $title .= ' (' . $this->language->get('text_weight') . ' ' . $this->weight->format($weight, $this->config->get('shipping_fedex_weight_class_id')) . ')'; 225 } 226 227 $method_data = array( 228 'code' => 'fedex', 229 'title' => $title, 230 'quote' => $quote_data, 231 'sort_order' => $this->config->get('shipping_fedex_sort_order'), 232 'error' => $error 233 ); 234 } 235 236 return $method_data; 237 } 238 }