tessguefen
2/6/2015 - 5:04 AM

UPS Time in Transit

UPS Time in Transit

<?php
class upsEstimate {
	var $AccessLicenseNumber;  
	var $UserId;  
	var $Password;
	var $shipperNumber;
	var $credentials;
	var $dimensionsUnits = "IN";
	var $weightUnits = "LBS";

    function setCredentials($access,$user,$pass,$shipper) {
		$this->AccessLicenseNumber = $access;
		$this->UserID = $user;
		$this->Password = $pass;	
		$this->shipperNumber = $shipper;
		$this->credentials = 1;
    }
	
	function setDimensionsUnits($unit){
		$this->dimensionsUnits = $unit;
	}
	
	function setWeightUnits($unit){
		$this->weightUnits = $unit;
	}

    // Define the function getRate() - no parameters
    function getRate($toCity, $toState, $toZip, $toCountry, $packageWeight, $today) {
	if ($this->credentials != 1) {
		print 'Please set your credentials with the setCredentials function';
		die();
	}
	$data ="<?xml version=\"1.0\"?>
    	<AccessRequest xml:lang='en-US'>
    	    <AccessLicenseNumber>$this->AccessLicenseNumber</AccessLicenseNumber>
    	    <UserId>$this->UserID</UserId>
    	    <Password>$this->Password</Password>
       </AccessRequest>
	   <?xml version='1.0'?>
        <TimeInTransitRequest xml:lang='en-US'>
          <Request>
            <TransactionReference>
            <CustomerContext>COMPANY NAME HERE</CustomerContext>
              <XpciVersion>1.001</XpciVersion>
            </TransactionReference>
            <RequestAction>TimeInTransit</RequestAction>
          </Request>
          <TransitFrom>
            <AddressArtifactFormat>
              <PoliticalDivision2>San Diego</PoliticalDivision2>
              <PoliticalDivision1>CA</PoliticalDivision1>
              <PostcodePrimaryLow>92115</PostcodePrimaryLow>
              <CountryCode>US</CountryCode>
            </AddressArtifactFormat>
          </TransitFrom>
          <TransitTo>
            <AddressArtifactFormat>
              <PoliticalDivision2>$toCity</PoliticalDivision2>
              <PoliticalDivision1>$toState</PoliticalDivision1>
              <PostcodePrimaryLow>$toZip</PostcodePrimaryLow>
              <CountryCode>$toCountry</CountryCode>
            </AddressArtifactFormat>
          </TransitTo>
          <PickupDate>$today</PickupDate>


          <MaximumListSize>5</MaximumListSize>
          <InvoiceLineTotal>
            <CurrencyCode>USD</CurrencyCode>
            <MonetaryValue>0</MonetaryValue>
          </InvoiceLineTotal>
          <ShipmentWeight>
            <UnitOfMeasurement>
              <Code>LBS</Code>
              <Description>Pounds</Description>
            </UnitOfMeasurement>
            <Weight>$packageWeight</Weight>
          </ShipmentWeight>
        </TimeInTransitRequest>";  
    // This is the PRODUCTION server -- use when your testing is finished.
    // https://onlinetools.ups.com/ups.app/xml/TimeInTransit
    //This is the TESTING SERVER.
		$ch = curl_init("https://wwwcie.ups.com/ups.app/xml/TimeInTransit");  
		curl_setopt($ch, CURLOPT_HEADER, 1);  
		curl_setopt($ch,CURLOPT_POST,1);  
		curl_setopt($ch,CURLOPT_TIMEOUT, 60);  
		curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);  
		curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);  
		curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);  
		curl_setopt($ch,CURLOPT_POSTFIELDS,$data);  
		$result=curl_exec ($ch);  
	    	//echo '<!-- '. $result. ' -->'; // THIS LINE IS FOR DEBUG PURPOSES ONLY-IT WILL SHOW IN HTML COMMENTS  
		$data = strstr($result, '<?');
        	$xml = simplexml_load_string($data);
		$json = json_encode($xml);
        	$array = json_decode($json,TRUE);
		curl_close($ch);  
		return $array;  
	    }  
    }
?>
<?php
/*
* This file is part of the Miva PHP Provision package.
*
* (c) Gassan Idriss <gidriss@mivamerchant.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/


/**
 * MivaArraySerializer
 * 
 * Takes a PHP array and serializes it for use in MivaScript which can then be
 * deserialized to a miva structure/array
 *
 * @author Gassan Idriss <gidriss@mivamerchant.com>
*/
class MivaArraySerializer
{
   
   /**
    * serialize
    * 
    * @param array $data
    * @return string
    */
   public static function serialize(array $data)
   {
       return static::isAssociativeArray($data) ? 
        static::serializeStructure($data) : static::serializeArray($data);

   }
    
   /**
    * isAssociativeArray
    * 
    * @param array $test
    * @return bool
    */
   public static function isAssociativeArray(array $test)
   {
       return (bool)count(array_filter(array_keys($test), 'is_string'));
   }
   
   /**
    * serializeStructure
    *
    * @param array $data
    * @param string $owningMember
    *
    * @return string
    */
   public static function serializeStructure(array $data, $owningMember = '')
   {
       $serializedData = array();
       
       foreach($data as $key => $value) {
           $_key = $owningMember.':'.$key;           
           if( is_array($value) ) {
               $dataToMerge = static::serializeArray($value, $_key);
               if ($dataToMerge) {
                   $serializedData[] = $dataToMerge;
               }
           } else {
               $serializedData[] = $_key.'='.urlencode($value);
           }
       }
              
       return implode(',', $serializedData);
   }
   
   /**
    * serializeArray
    *
    * @param array $data
    * @param string $owningMember
    * 
    * @return string
    */
   public static function serializeArray(array $data, $owningMember = '')
   {
       if (static::isAssociativeArray($data)) {
           return static::serializeStructure($data, $owningMember);
       }
       
       $serializedData = array();
       
       foreach ($data as $key => $value) {
           $_key = $owningMember.'['.($key+1).']';
           if (is_array($value)){
               if (static::isAssociativeArray($value)) {
                   $dataToMerge = static::serializeStructure($value, $_key);
                   if ($dataToMerge) {
                       $serializedData[] = $dataToMerge;
                   }
               } else {
                    $dataToMerge = static::serializeArray($value, $_key);
                   if ($dataToMerge) {
                       $serializedData[] = $dataToMerge;
                   }
               }      
           } else {
               $serializedData[] = $_key.'='.urlencode($value);
           }
       }
       
       return implode(',', $serializedData);
   }
   
}
<?php
/* UPS CODES

    UPS Next Day Air		| 1DA	|Miva: 1DA
    UPS Next Day Air Saver	| 1DP
    UPS 2nd Day Air A.M.	| 2DM
    UPS 2nd Day Air		| 2DA 	|Miva: 02
    UPS 3 Day Select		| 3DS 	|Miva: 12
    UPS GROUND			| GND	|Miva: 03
    
*/
$toCity = $_REQUEST['toCity'];
$toState = $_REQUEST['toState'];
$toZip = $_REQUEST['toZip'];
$toCountry = $_REQUEST['toCountry'];
$packageWeight = $_REQUEST['packageWeight'];


// You can add changes in here.. For instance if it's after 4pm, ship the next day?
$nextTuesday = strtotime("next Tuesday");
$today = date('Ymd', $nextTuesday);
//$today = date('Ymd');
?>
<?php
			
		require("upsEstimate.php");
		include_once("miva-array.php");

		/*************************************
		Get your own credentials from ups.com
		*************************************/
		$ups_accessnumber = "YOUR ACCESS NUMBER";
		$ups_username = "YOUR USERNAME";
		$ups_password = "YOUR PASSWORD";
		$ups_shippernumber = ""; // This can be empty.
	
		// All UPS Services you want
		$services = array(
			"03"=>"GND",
                        "12"=>"3DS",
                        "02"=>"2DA",
                        "01"=>"1DA"
			);
		
        $myRate = new upsEstimate;
        $myRate->setCredentials($ups_accessnumber, $ups_username, $ups_password, $ups_shippernumber);
        $rate = $myRate->getRate($toCity, $toState, $toZip, $toCountry, $packageWeight, $today);

        $estimates = $rate['TransitResponse']['ServiceSummary'];
        
        $mivaArray = [];

        foreach ( $services as $name => $code) {
            foreach ( $estimates as $r ) {
                if ( $r['Service']['Code'] == $code ) {
                    $time = strtotime($r['EstimatedArrival']['Date']);
                    $date = date('l, F d, Y', $time); 
                    $mivaArray[] = array('module' => 'upsxml', 'code' => $name, 'estimate' => $date);
                }
           }
        }	

   echo MivaArraySerializer::serialize($mivaArray);
?>
<mvt:foreach array="shippingmethods" iterator="method">
	<mvt:assign name="estimatedtime" value="''" />
	<mvt:assign name="l.settings:shippingMethodCode" value="ltrim(l.settings:method:code)" />
	<mvt:foreach array="estimatedtime" iterator="et">
        <mvt:if expr="l.settings:method:code EQ l.settings:et:code AND l.settings:method:module EQ l.settings:et:module">
            <mvt:assign name="estimatedtime" value="' - ' $ l.settings:et:estimate" />
        </mvt:if>
    </mvt:foreach>
	<div class="form-row">
		<mvt:if expr="pos1 EQ 1">
			<span class="column one-tenth"><input type="radio" name="ShippingMethod" value="&mvte:method:module;:&mvte:method:code;" checked="checked" id="l-shipping-method-&mvte:shippingMethodCode;" /></span>
			<label for="l-shipping-method-&mvte:shippingMethodCode;" class="column three-fifths">&mvt:method:name;&mvt:global:estimatedtime;</label>
			<mvt:if expr="NOT ISNULL l.settings:method:price">
				<span class="column three-tenths align-right">&mvt:method:formatted_price;</span>
			</mvt:if>
		<mvt:else>
			<span class="column one-tenth"><input type="radio" name="ShippingMethod" value="&mvte:method:module;:&mvte:method:code;" id="l-shipping-method-&mvte:shippingMethodCode;" /></span>
			<label for="l-shipping-method-&mvte:shippingMethodCode;" class="column three-fifths">&mvt:method:name;&mvt:global:estimatedtime;</label>
			<mvt:if expr="NOT ISNULL l.settings:method:price">
				<span class="column three-tenths align-right">&mvt:method:formatted_price;</span>
			</mvt:if>
		</mvt:if>
	</div>
</mvt:foreach>
<mvt:assign name="theUrl" value="'http://' $ g.domain:name $ '/time-in-transit/index.php?toCity=' $ g.Basket:ship_city $ '&toState=' $ g.Basket:ship_state $ '&toZip=' $ g.Basket:ship_zip $ '&toCountry=' $ g.Basket:ship_cntry $ '&packageWeight=' $ g.basket:weight" />
<mvt:assign name="cleanUrl" value="glosub( g.theUrl, ' ', '%20' )" />
<mvt:assign name="l.settings:estimatedtime" value="miva_array_deserialize( g.timeintransit )" />
<mvt:call action="g.cleanUrl" method="'GET'">
	<mvt:assign name="l.settings:estimatedtime" value="miva_array_deserialize( s.callvalue )" />
</mvt:call>
http://tessguefen.com/time-in-transit/index.php?toCity=Miami&toState=FL&toZip=33142&toCountry=US&packageWeight=2