[ // United States '01' => 'UPS Next Day Air', '02' => 'UPS 2nd Day Air', '03' => 'UPS Ground', '07' => 'UPS Worldwide Express', '08' => 'UPS Worldwide Expedited', '11' => 'UPS Standard', '12' => 'UPS 3 Day Select', '13' => 'UPS Next Day Air Saver', '14' => 'UPS Next Day Air Early A.M.', '54' => 'UPS Worldwide Express Plus', '59' => 'UPS 2nd Day Air A.M.', '65' => 'UPS Saver', ], 'CA' => [ // Canada '01' => 'UPS Express', '02' => 'UPS Expedited', '07' => 'UPS Worldwide Express', '08' => 'UPS Worldwide Expedited', '11' => 'UPS Standard', '12' => 'UPS 3 Day Select', '13' => 'UPS Saver', '14' => 'UPS Express Early A.M.', '54' => 'UPS Worldwide Express Plus', '65' => 'UPS Saver', ], 'EU' => [ // European Union '07' => 'UPS Express', '08' => 'UPS Expedited', '11' => 'UPS Standard', '54' => 'UPS Worldwide Express Plus', '65' => 'UPS Saver', '82' => 'UPS Today Standard', '83' => 'UPS Today Dedicated Courier', '84' => 'UPS Today Intercity', '85' => 'UPS Today Express', '86' => 'UPS Today Express Saver', '01' => 'UPS Next Day Air', '02' => 'UPS 2nd Day Air', '03' => 'UPS Ground', '14' => 'UPS Next Day Air Early A.M.', ], 'MX' => [ // Mexico '07' => 'UPS Express', '08' => 'UPS Expedited', '54' => 'UPS Express Plus', '65' => 'UPS Saver', ], 'other' => [ // Other '07' => 'UPS Express', '08' => 'UPS Worldwide Expedited', '11' => 'UPS Standard', '54' => 'UPS Worldwide Express Plus', '65' => 'UPS Saver', ], ]; public function __construct($options = []) { parent::__construct($options); $this->accessKey = Arr::get($options, 'accessKey'); $this->userId = Arr::get($options, 'userId'); $this->password = Arr::get($options, 'password'); $this->shipperNumber = Arr::get($options, 'shipperNumber'); $this->approvedCodes = Arr::get($options, 'approvedCodes', [ '03', '12', ]); $this->setRequestAdapter(Arr::get($options, 'requestAdapter', new RateRequest\Post())); } protected function validate() { $this->validatePackages(); Validator::checkIfNull($this->accessKey, 'accessKey'); Validator::checkIfNull($this->userId, 'userId'); Validator::checkIfNull($this->password, 'password'); Validator::checkIfNull($this->shipperNumber, 'shipperNumber'); Validator::checkIfNull($this->shipment->getFromPostalCode(), 'fromPostalCode'); Validator::checkIfNull($this->shipment->getFromCountryCode(), 'fromCountryCode'); Validator::checkIfNull($this->shipment->getFromIsResidential(), 'fromIsResidential'); Validator::checkIfNull($this->shipment->getToPostalCode(), 'toPostalCode'); Validator::checkIfNull($this->shipment->getToCountryCode(), 'toCountryCode'); Validator::checkIfNull($this->shipment->getToIsResidential(), 'toIsResidential'); return $this; } protected function prepare() { $service_code = '03'; $this->data = '' . "\n" . '' . '' . $this->accessKey . ''. '' . $this->userId . '' . '' . $this->password . '' . '' . '' . '' . 'Rate' . 'shop' . '' . '' . '' . '
' . '' . $this->shipment->getFromPostalCode() . '' . '' . $this->shipment->getFromCountryCode() . '' . ( $this->shipment->getFromIsResidential() ? '1' : '' ) . '
' . '' . $this->shipperNumber . '' . '
' . '' . '
' . '' . $this->shipment->getToPostalCode() . '' . '' . $this->shipment->getToCountryCode() . '' . ( $this->shipment->getToIsResidential() ? '1' : '' ) . '
' . '
' . '' . '
' . '' . $this->shipment->getFromStateProvinceCode() . '' . '' . $this->shipment->getFromPostalCode() . '' . '' . $this->shipment->getFromCountryCode() . '' . ( $this->shipment->getFromIsResidential() ? '1' : '' ) . '
' . '
' . '' . '' . $service_code . '' . '' . $this->getPackagesXmlString() . '' . '' . '' . '
' . '
'; return $this; } protected function getPackagesXmlString() { $packages = ''; foreach ($this->shipment->getPackages() as $p) { $packages .= '' . '' . '02' . '' . '' . '' . 'IN' . '' . '' . $p->getLength() . '' . '' . $p->getWidth() . '' . '' . $p->getHeight() . '' . '' . '' . '' . 'LBS' . '' . '' . $p->getWeight() . '' . '' . ''; } return $packages; } protected function execute() { if ($this->isProduction) { $url = $this->urlProd; } else { $url = $this->urlDev; } $this->response = $this->rateRequest->execute($url, $this->data); return $this; } protected function process() { try { $dom = new DOMDocument('1.0', 'UTF-8'); $dom->loadXml($this->response); $rate_list = $dom->getElementsByTagName('RatedShipment'); if (empty($rate_list->length)) { throw new Exception('Unable to get UPS Rates.'); } } catch (Exception $e) { echo $this->response; throw $e; } foreach ($rate_list as $rate) { $code = @$rate ->getElementsByTagName('Service')->item(0) ->getElementsByTagName('Code')->item(0)->nodeValue; $name = Arr::get($this->shippingCodes['US'], $code); $cost = @$rate ->getElementsByTagName('TotalCharges')->item(0) ->getElementsByTagName('MonetaryValue')->item(0)->nodeValue; if (! empty($this->approvedCodes) && ! in_array($code, $this->approvedCodes)) { continue; } $quote = new Quote; $quote ->setCarrier('ups') ->setCode($code) ->setName($name) ->setCost($cost * 100); $this->rates[] = $quote; } return $this; } }