<?php
|
|
if(!defined('QUINTACMS') ) die("No quinta.");
|
|
|
|
if (!defined("PAYMENTMODULE.CLASS.PHP")){
|
|
define("PAYMENTMODULE.CLASS.PHP",1);
|
|
|
|
/**
|
|
* Class PaymentModule - a module to manage PaymentMethods
|
|
*
|
|
* This class iterates through the list of PaymentMethods in the payment_methods table
|
|
* and for each that is flagged active it creates a QRadioButton to be rendered in the template.
|
|
* When the button is clicked, it sets objSelectedMethod to the selected payment method.
|
|
* When the 'Purchase' button is clicked the btn_Purchase function is called; this calls three
|
|
* functions that a PaymentAction is required to implement:
|
|
* - PreProcess: perform any actions to set up the transaction
|
|
* - Process: perform the actual transaction, ie. connect to server and make a request in most cases.
|
|
* - PostProcess: perform any validation checks and update the order_status_history table in most cases.
|
|
*
|
|
*
|
|
*@author Erik Winn <sidewalksoftware@gmail.com>
|
|
*
|
|
*@version 0.3
|
|
*
|
|
*@package Quinta
|
|
* @subpackage Modules
|
|
*/
|
|
class PaymentModule extends QPanel{
|
|
/**
|
|
*@var CheckOutModule a reference to the control block - expected to be CheckOutModule
|
|
*/
|
|
protected $objControlBlock;
|
|
/**
|
|
*@var Order a reference to the current order
|
|
*/
|
|
protected $objOrder;
|
|
/**
|
|
*@var Address a reference to the current order
|
|
*/
|
|
protected $objAddress;
|
|
/**
|
|
*@var array PaymentMethods flagged active in database
|
|
*/
|
|
protected $aryPaymentMethods;
|
|
/**
|
|
*@var PaymentMethod a reference to the method chosen by the user (or the default)
|
|
*/
|
|
protected $objSelectedMethod;
|
|
/**
|
|
*@var PaymentAction the action for the selected payment method
|
|
*/
|
|
protected $objPaymentAction=null;
|
|
/**
|
|
*@var string strDefaultServiceProvider - the default payment gateway
|
|
*/
|
|
protected $strDefaultServiceProvider = DEFAULT_PAYMENT_PROVIDER;
|
|
/**
|
|
*@var string strDefaultServiceType - the default payment type for the default service
|
|
*/
|
|
protected $strDefaultServiceType = DEFAULT_PAYMENT_SERVICE;
|
|
|
|
/**
|
|
*@var array aryYears - years for CC expiration selection
|
|
*/
|
|
protected $aryYears = array(
|
|
'2008',
|
|
'2009',
|
|
'2010',
|
|
'2011',
|
|
'2012',
|
|
'2013',
|
|
'2014',
|
|
'2015',
|
|
'2016',
|
|
'2017',
|
|
'2018',
|
|
);
|
|
/**
|
|
*@var array aryMonths - months for CC expiration selection
|
|
*/
|
|
protected $aryMonths = array(
|
|
'01',
|
|
'02',
|
|
'03',
|
|
'04',
|
|
'05',
|
|
'06',
|
|
'07',
|
|
'08',
|
|
'09',
|
|
'10',
|
|
'11',
|
|
'12',
|
|
);
|
|
|
|
protected $strErrors;
|
|
protected $fltPaymentTotal;
|
|
protected $blnHasActiveMethods = true;
|
|
/**
|
|
*@var bool blnShowCCInput - if true display Credit card input fields
|
|
*/
|
|
protected $blnShowCCInput = false;
|
|
/**
|
|
*@var integer intPreviousAddressId - the id of the address before a selection signal.
|
|
*/
|
|
protected $intPreviousAddressId;
|
|
|
|
/// Display objects ..
|
|
/**
|
|
*@var array PaymentMethodControllers for the selection of PaymentMethods
|
|
*/
|
|
public $aryPaymentMethodControllers;
|
|
/**
|
|
*@var QButton Button to complete the purchase - triggers a payment action
|
|
*/
|
|
public $btnPurchase;
|
|
/**
|
|
* @todo subclass for validation ..QCCTextBox?
|
|
*@var QTextBox
|
|
*/
|
|
public $txtCCNumber;
|
|
/**
|
|
*@var QListBox
|
|
*/
|
|
public $lstCCExpirationYear;
|
|
/**
|
|
*@var QListBox
|
|
*/
|
|
public $lstCCExpirationMonth;
|
|
/**
|
|
* @todo implement CCV Check ..
|
|
*@var QTextBox
|
|
*/
|
|
public $txtCCVNumber;
|
|
/**
|
|
*@var AddressSelectionModule objAddressSelectionModule - handles selecting the billing address
|
|
*/
|
|
public $objAddressSelectionModule;
|
|
|
|
/**
|
|
* Module constructor
|
|
*@param ContentBlock - parent controller object.
|
|
*@param Order - the order for which we are paying.
|
|
*/
|
|
public function __construct(QPanel $objControlBlock, $objOrder ){
|
|
|
|
try {
|
|
parent::__construct($objControlBlock);
|
|
} catch (QCallerException $objExc) {
|
|
$objExc->IncrementOffset();
|
|
throw $objExc;
|
|
}
|
|
$this->objOrder =& $objOrder;
|
|
$this->objControlBlock =& $objControlBlock;
|
|
|
|
$this->AutoRenderChildren = true;
|
|
|
|
$this->strTemplate = __QUINTA_CORE_VIEWS__ . '/PaymentModule.tpl.php';
|
|
|
|
$this->aryPaymentMethods = PaymentMethod::QueryArray(
|
|
QQ::Equal(QQN::PaymentMethod()->Active, true),
|
|
QQ::OrderBy(QQN::PaymentMethod()->SortOrder, false)
|
|
);
|
|
|
|
if(!empty( $this->aryPaymentMethods )){
|
|
$this->objAddressSelectionModule = new AddressSelectionModule($this,
|
|
'SelectAddress',
|
|
$this->objOrder->BillingAddressId
|
|
);
|
|
$this->objAddress = $this->objAddressSelectionModule->Address;
|
|
$this->createInputOptions();
|
|
}else
|
|
$this->blnHasActiveMethods = false;
|
|
}
|
|
/**
|
|
*This creates the method views for the available payment methods and the input fields for
|
|
* credit card numbers (if needed)
|
|
*/
|
|
protected function createInputOptions(){
|
|
$this->blnShowCCInput = false;
|
|
|
|
foreach($this->aryPaymentMethods as &$objPaymentMethod){
|
|
$objPaymentMethodController = new PaymentMethodController($this, $objPaymentMethod);
|
|
if( $objPaymentMethod->ServiceProvider == $this->DefaultServiceProvider
|
|
&& $objPaymentMethod->ServiceType == $this->DefaultServiceType )
|
|
{
|
|
$objPaymentMethodController->Checked = true;
|
|
$this->objSelectedMethod =& $objPaymentMethod;
|
|
$this->objOrder->PaymentMethodId = $objPaymentMethod->Id;
|
|
}
|
|
if( $objPaymentMethod->RequiresCcNumber )
|
|
$this->blnShowCCInput = true;
|
|
$this->aryPaymentMethodControllers[] = $objPaymentMethodController;
|
|
}
|
|
//credit card input fields
|
|
if($this->blnShowCCInput){
|
|
$this->txtCCNumber = new QTextBox($this);
|
|
$this->txtCCNumber->CssClass = 'CCNumber';
|
|
$this->txtCCNumber->Required = true;
|
|
$this->txtCCNumber->Name = Quinta::Translate('Card Number') . ': ';
|
|
$this->txtCCNumber->Text = '';
|
|
$this->txtCCVNumber = new QTextBox($this);
|
|
$this->txtCCVNumber->CssClass = 'CCVNumber';
|
|
$this->txtCCVNumber->Required = true;
|
|
$this->txtCCVNumber->Name = Quinta::Translate('CCV Number') . ': ';
|
|
|
|
$this->lstCCExpirationYear = new QListBox($this);
|
|
foreach($this->aryYears as $strYear)
|
|
$this->lstCCExpirationYear->AddItem($strYear, $strYear);
|
|
$this->lstCCExpirationYear->Required = true;
|
|
|
|
$this->lstCCExpirationMonth = new QListBox($this);
|
|
foreach($this->aryMonths as $strMonth)
|
|
$this->lstCCExpirationMonth->AddItem($strMonth,$strMonth);
|
|
$this->lstCCExpirationMonth->Required = true;
|
|
}
|
|
}
|
|
/**
|
|
* Sets the selected payment method, called when the user selects/changes a payment
|
|
* method radio button.
|
|
*/
|
|
public function SelectMethod($intMethodId){
|
|
foreach($this->aryPaymentMethods as &$objMethod ){
|
|
if($intMethodId == $objMethod->Id){
|
|
$this->objSelectedMethod =& $objMethod;
|
|
$this->objOrder->PaymentMethodId = $objMethod->Id;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
public function SelectAddress($intAddressId, $strParameter=null){
|
|
if( is_numeric($intAddressId) ){
|
|
$this->intPreviousAddressId = $intAddressId;
|
|
$this->objOrder->SetBillingAddress($this->objAddressSelectionModule->Address);
|
|
$this->objAddress = $this->objAddressSelectionModule->Address;
|
|
}
|
|
$this->objAddressSelectionModule->RemoveChildControls(true);
|
|
$this->RemoveChildControl($this->objAddressSelectionModule->ControlId, false);
|
|
|
|
if( 'Edit' == $strParameter )
|
|
$this->objAddressSelectionModule = new AddressSelectionModule($this, 'SelectAddress', $intAddressId, true);
|
|
elseif( 'New' == $strParameter )
|
|
$this->objAddressSelectionModule = new AddressSelectionModule($this, 'SelectAddress', null, true);
|
|
else {//Note: includes Save and Cancel ..
|
|
if($intAddressId)
|
|
$this->objAddressSelectionModule = new AddressSelectionModule($this, 'SelectAddress', $intAddressId);
|
|
else
|
|
$this->objAddressSelectionModule = new AddressSelectionModule($this, 'SelectAddress', $this->intPreviousAddressId);
|
|
}
|
|
$this->objAddressSelectionModule->Visible = true;
|
|
$this->AddChildControl($this->objAddressSelectionModule);
|
|
}
|
|
|
|
public function Validate(){ return true;}
|
|
|
|
public function __get($strName){
|
|
switch ($strName){
|
|
case 'SelectedMethod':
|
|
return $this->objSelectedMethod ;
|
|
case 'Address':
|
|
return $this->objAddress ;
|
|
case 'HasActiveMethods':
|
|
return $this->blnHasActiveMethods ;
|
|
case 'ShowCCInput':
|
|
return $this->blnShowCCInput ;
|
|
case 'DefaultServiceProvider':
|
|
return $this->strDefaultServiceProvider ;
|
|
case 'DefaultServiceType':
|
|
return $this->strDefaultServiceType ;
|
|
case 'Errors':
|
|
return $this->strErrors ;
|
|
case 'Order':
|
|
return $this->objOrder ;
|
|
default:
|
|
try {
|
|
return parent::__get($strName);
|
|
} catch (QCallerException $objExc) {
|
|
$objExc->IncrementOffset();
|
|
throw $objExc;
|
|
}
|
|
}
|
|
}
|
|
public function __set($strName, $mixValue){
|
|
switch ($strName){
|
|
case 'SelectedMethod':
|
|
try {
|
|
return ($this->objSelectedMethod = QType::Cast($mixValue, 'PaymentMethod' ));
|
|
} catch (QInvalidCastException $objExc) {
|
|
$objExc->IncrementOffset();
|
|
throw $objExc;
|
|
}
|
|
case 'DefaultServiceProvider':
|
|
try {
|
|
return ($this->strDefaultServiceProvider = QType::Cast($mixValue, Qtype::String ));
|
|
} catch (QInvalidCastException $objExc) {
|
|
$objExc->IncrementOffset();
|
|
throw $objExc;
|
|
}
|
|
case 'DefaultServiceType':
|
|
try {
|
|
return ($this->strDefaultServiceType = QType::Cast($mixValue, Qtype::String ));
|
|
} catch (QInvalidCastException $objExc) {
|
|
$objExc->IncrementOffset();
|
|
throw $objExc;
|
|
}
|
|
|
|
default:
|
|
try {
|
|
return (parent::__set($strName, $mixValue));
|
|
} catch (QCallerException $objExc) {
|
|
$objExc->IncrementOffset();
|
|
throw $objExc;
|
|
}
|
|
}
|
|
}
|
|
|
|
}//end class
|
|
}//end define
|
|
?>
|