Init($objOrder); * $fltRate = $objMethod->GetRate(); * $strImage = $objMethod->GetLabel(); * * @todo - some of the way sizing is dealt with only works for thin things (eg. books, PCBs), * and multiple packages are not handled. this needs work and perhaps some refactoring of design .. * * @package Quasi * @subpackage ORM * */ class ShippingMethod extends ShippingMethodGen { /** * This is used to store a reference to the order being shipped * @var object objOrder */ private $objOrder = null; /** * An array of CustomsInformation objects * @var array aryCustomsInformation */ private $aryCustomsInformation; /** * This is used to store an instance of the class used to implement this method. * The implementation extends ShippingRequest and performs the actual requests. It may * also delegate tasks to other ShippingRequest classes as needed (eg. USPSRequest may * use EndiciaRequest to create a label ..) * @var object objImplementation - implementation class for method */ private $objImplementation = null; /** * Flag for whether this module can make web requests - Local PickUp for example * does not * @var boolean blnWebEnabled */ private $blnWebEnabled; /** * This is used by the ShippingModule to record the rate returned by the calculator for a particular * order address and weight. * @var float fltRate - the rate to be charged for this method and order */ private $fltRate; ///Package data .. Most of this is set in Init(objOrder) from the data in the order. /** *@var string Used to indicate special containers - optional, defaults to empty string */ protected $strContainer = ''; /** *@var integer Weight in pounds */ protected $intPounds=0; /** *@var float Weight in ounces */ protected $fltOunces=5; /** * Corresponds to Z Axis *@var integer Height in inches */ protected $intHeight; /** * Corresponds to Y Axis *@var integer Length in inches */ protected $intLength; /** * Corresponds to X Axis *@var integer Width in inches */ protected $intWidth; /** *@var integer Girth in inches */ protected $intGirth; /** *@var bool True if the package may be machine processed *@warning - this should be configurable .. */ protected $blnIsMachinable = true; /// Routing data .. /** *@var integer the desination country */ protected $intDestinationCountryId; /** *@var integer the origin country */ protected $intOriginCountryId; /** *@var integer the desination state or province */ protected $intDestinationZoneId; /** *@var integer the origin state or province */ protected $intOriginZoneId; /** * This is used to store the destination postal code * @var string strDestinationZip */ protected $strDestinationZip; /** * This is used to store the origin postal code * @var string strOriginZip */ protected $strOriginZip; /** * Default "to string" handler * Allows pages to _p()/echo()/print() this object, and to define the default * way this object would be outputted. * * Can also be called directly via $objShippingMethod->__toString(). * * @return string a nicely formatted string representation of this object */ public function __toString() { return sprintf('%s %s', $this->Carrier, $this->ServiceType); } /** * This function initializes the shipping method with values for the specific order, eg. addresses * weight, dimensions, etc. For WebEnabled methods the Implementation is created here. * *@param Order objOrder - the order to be shipped .. *@return boolean - true if implementation exists */ public function Init( Order $objOrder ) { if( '' == $this->ClassName) throw new QCallerException(sprintf('Empty ShippingMethod Class for %s', $this->__toString() ) ); //Some shipping methods do not require calculation, like in store PickUp .. if( false !== stripos( 'NoClass', $this->ClassName) ) $this->blnWebEnabled = false; else { $strClassName = $this->ClassName . 'Request'; if( class_exists($strClassName) ) { $this->objImplementation = new $strClassName($this); $this->blnWebEnabled = true; } else throw new QCallerException(sprintf('ShippingMethod Class "%s" for "%s" was not found!', $strClassName, $this->__toString() ) ); } $this->objOrder = $objOrder; $this->fltRate = DEFAULT_SHIPPING_RATE; $this->strOriginZip = STORE_POSTAL_CODE; ///@todo - fixme, configure Origin somehow, temporary fix .. $this->intOriginCountryId = 223; //usa .. $this->intOriginZoneId = 13; //colorado .. $this->strDestinationZip = substr($objOrder->ShippingPostalCode, 0, 5 ); $this->intDestinationCountryId = $objOrder->ShippingCountryId; $this->intDestinationZoneId = $objOrder->ShippingZoneId; if(! $this->TestMode ) { $this->Ounces = $objOrder->TotalOunces; $this->Pounds = $objOrder->TotalPounds; $this->Width = $objOrder->XAxisSize; $this->Length = $objOrder->YAxisSize; $this->Height = $objOrder->ZAxisSize; } return true; } /** * This function returns a rate for the method. You must call Init(objOrder) before using this. * Note: if you define class_name as "NoClass" it will return the default (DEFAULT_SHIPPING_RATE) * This is to support methods that do not require calculation (eg. local pick up ..). * @return float rate for the method/order */ public function GetRate() { if( ! $this->blnWebEnabled) return $this->fltRate; if(!$this->objImplementation) throw new QCallerException('ShippingMethod::GetRate - Implementation uninitialized, you must call Init(objOrder) first!'); try { $this->fltRate = $this->objImplementation->GetRate(); } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } return $this->fltRate; } /** * This function attempts to return a shipping label image for the method. * You must call Init(objOrder) before using this. * Note: if you define class_name as "NoClass" it will return null - * this is to support methods that do not require calculation (eg. local pick up ..). * @return image object for the method/order (or null) */ public function GetShippingLabel() { if('NoClass' == $this->ClassName ) return null; if(!$this->objImplementation) throw new QCallerException('ShippingMethod::GetRate - Implementation uninitialized, you must call Init(objOrder) first!'); try { return $this->objImplementation->GetLabel(); } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } } public function __get($strName) { switch ($strName) { case 'WebEnabled': return $this->blnWebEnabled; case 'CustomsFormImages': if( false !== stripos( 'NoClass', $this->ClassName) ) return null; if( isset($this->objImplementation) ) return $this->objImplementation->CustomsFormImages; return null; case 'ExtraDocumentImages': if( false !== stripos( 'NoClass', $this->ClassName) ) return null; if( isset($this->objImplementation) ) return $this->objImplementation->ExtraDocumentImages; return null; case 'IsAvailable': if( false !== stripos( 'NoClass', $this->ClassName) ) return true; if( isset($this->objImplementation) ) return $this->objImplementation->IsAvailable; return false; case 'HasErrors': if( isset($this->objImplementation) ) return $this->objImplementation->HasErrors; return false; case 'Errors': if( isset($this->objImplementation) ) return $this->objImplementation->Errors; return ''; case 'IsMachinable': return $this->blnIsMachinable; case 'Order': return $this->objOrder; case 'OrderId': return $this->objOrder->Id; case 'Rate': return $this->fltRate; case 'Ounces': return $this->fltOunces; case 'Pounds': return $this->intPounds; case 'DestinationZip': return $this->strDestinationZip; case 'OriginZip': return $this->strOriginZip; case 'Container': return $this->strContainer; case 'DestinationCountryId': return $this->intDestinationCountryId; case 'DestinationStateId': case 'DestinationProvinceId': case 'DestinationZoneId': return $this->intDestinationZoneId; case 'OriginCountryId': return $this->intOriginCountryId; case 'OriginStateId': case 'OriginProvinceId': case 'OriginZoneId': return $this->intOriginZoneId; ///string representation of country and state names .. case 'DestinationCountry': return ($this->DestinationCountryId) ? CountryType::$NameArray[$this->DestinationCountryId] : null; case 'DestinationState': case 'DestinationProvince': case 'DestinationZone': return ($this->DestinationZoneId) ? ZoneType::$NameArray[$this->DestinationZoneId] : null; case 'OriginCountry': return ($this->OriginCountryId) ? CountryType::$NameArray[$this->OriginCountryId] : null; case 'OriginState': case 'OriginProvince': case 'OriginZone': return ($this->OriginZoneId) ? ZoneType::$NameArray[$this->OriginZoneId] : null; ///string representation of country and state ISO 2 letter codes .. case 'DestinationCountryCode': return ($this->DestinationCountryId) ? CountryType::ToIsoCode2($this->DestinationCountryId) : null; case 'DestinationStateCode': case 'DestinationProvinceCode': case 'DestinationZoneCode': return ($this->DestinationZoneId) ? ZoneType::ToCode($this->DestinationZoneId) : null; case 'OriginCountryCode': return ($this->OriginCountryId) ? CountryType::ToIsoCode2($this->OriginCountryId) : null; case 'OriginStateCode': case 'OriginProvinceCode': case 'OriginZoneCode': return ($this->OriginZoneId) ? ZoneType::ToCode($this->OriginZoneId) : null; default: try { return parent::__get($strName); } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } } } public function __set($strName, $mixValue) { switch ($strName) { case 'Rate': try { return ($this->fltRate = QType::Cast($mixValue, QType::Float)); } catch (QInvalidCastException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'Ounces': try { return ($this->fltOunces = QType::Cast($mixValue, QType::Float)); } catch (QInvalidCastException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'Pounds': try { return ($this->intPounds = QType::Cast($mixValue, QType::Integer)); } catch (QInvalidCastException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'DestinationZip': try { return ($this->strDestinationZip = QType::Cast($mixValue, QType::String)); } catch (QInvalidCastException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'OriginZip': try { return ($this->strOriginZip = QType::Cast($mixValue, QType::String)); } catch (QInvalidCastException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'OriginCountryId': try { return ($this->intOriginCountryId = QType::Cast($mixValue, QType::Integer)); } catch (QInvalidCastException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'DestinationCountryId': try { return ($this->intDestinationCountryId = QType::Cast($mixValue, QType::Integer)); } catch (QInvalidCastException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'OriginStateId': case 'OriginProvinceId': case 'OriginZoneId': try { return ($this->intOriginZoneId = QType::Cast($mixValue, QType::Integer)); } catch (QInvalidCastException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'DestinationStateId': case 'DestinationProvinceId': case 'DestinationZoneId': try { return ($this->intDestinationZoneId = QType::Cast($mixValue, QType::Integer)); } catch (QInvalidCastException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'Container': try { return ($this->strContainer = QType::Cast($mixValue, QType::String )); } catch (QInvalidCastException $objExc) { $objExc->IncrementOffset(); throw $objExc; } /* case 'Size': try { return ($this->strSize = QType::Cast($mixValue, QType::String )); } catch (QInvalidCastException $objExc) { $objExc->IncrementOffset(); throw $objExc; }*/ case 'Height': try { return ($this->intHeight = QType::Cast(ceil($mixValue), QType::Integer )); } catch (QInvalidCastException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'Width': try { return ($this->intWidth = QType::Cast(ceil($mixValue), QType::Integer )); } catch (QInvalidCastException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'Length': try { return ($this->intLength = QType::Cast(ceil($mixValue), QType::Integer )); } catch (QInvalidCastException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'Girth': try { return ($this->intGirth = QType::Cast(ceil($mixValue), QType::Integer )); } catch (QInvalidCastException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'Pounds': try { return ($this->intPounds = QType::Cast($mixValue, QType::Integer )); } catch (QInvalidCastException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'Ounces': try { return ($this->fltOunces = QType::Cast($mixValue, QType::Float )); } catch (QInvalidCastException $objExc) { $objExc->IncrementOffset(); throw $objExc; } default: try { return (parent::__set($strName, $mixValue)); } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } } } } ?>