<?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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
?>
|