A QCodo powered CMS
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

471 lines
15 KiB

<?php
require(__DATAGEN_CLASSES__ . '/ShippingMethodGen.class.php');
/**
* The ShippingMethod class defined here contains all the application
* context depedant code for the ShippingMethod ORM object. It represents the
* "shipping_method" table in the database, and extends from the code generated
* abstract ShippingMethodGen. Additionally it contains data members and functions
* to support individual order shipping.
*
* The actual ShippingRequest object appropriate to the specific method is instantiated
* for WebEnabled methods according to the values for this method. If the method has
* a class_name field set to "NoClass" a default rate is set (DEFAULT_SHIPPING_CHARGE)
* and no Implementation is created (this is a "local pick up" option in the check out ).
*
* Users of this class should check the flag WebEnabled to determine if the Get*() methods
* are of use - GetRate may be called regardless as it will simply return the default rate.
*
* Basic Usage:
* Get estimate -
* $objMethod = ShippingMethod::Load($intId);
* $objMethod->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 Quinta
* @subpackage Models
*
*/
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;
}
}
}
}
?>