shop.balmet.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

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 }