Initial Commit of AgileBill Open Source
This commit is contained in:
430
modules/checkout/base_checkout_plugin.class.php
Normal file
430
modules/checkout/base_checkout_plugin.class.php
Normal file
@@ -0,0 +1,430 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* AgileBill - Open Billing Software
|
||||
*
|
||||
* This body of work is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the Open AgileBill License
|
||||
* License as published at http://www.agileco.com/agilebill/license1-4.txt
|
||||
*
|
||||
* For questions, help, comments, discussion, etc., please join the
|
||||
* Agileco community forums at http://forum.agileco.com/
|
||||
*
|
||||
* @link http://www.agileco.com/
|
||||
* @copyright 2004-2008 Agileco, LLC.
|
||||
* @license http://www.agileco.com/agilebill/license1-4.txt
|
||||
* @author Tony Landis <tony@agileco.com>
|
||||
* @package AgileBill
|
||||
* @version 1.4.93
|
||||
*/
|
||||
|
||||
/**
|
||||
* Base checkout plugin class
|
||||
*
|
||||
*/
|
||||
class base_checkout_plugin
|
||||
{
|
||||
var $checkout_id; /* current checkout plugin id */
|
||||
var $name; /* plugin name */
|
||||
var $type; /* redirect, gateway, or other */
|
||||
var $recurr_only=false; /* bool */
|
||||
var $return_url; /* return url */
|
||||
var $success_url; /* decline url */
|
||||
var $support_cur; /* supported currency array */
|
||||
var $cfg;
|
||||
var $flds;
|
||||
var $eft; /* true if checkout plugin type is eft */
|
||||
var $req_all_flds=true; /* require all account fields (first/last name, address1, state/province, zip) */
|
||||
var $req_fields_arr=false; /* if req_all_fields=false, use this array to define which fields will be required */
|
||||
var $billing; /* the billing details */
|
||||
var $account; /* the account level details */
|
||||
|
||||
/**
|
||||
* Get the checkout plugin settings from the database
|
||||
*/
|
||||
function getDetails($checkout_id) {
|
||||
if(!$checkout_id) return;
|
||||
$this->checkout_id = $checkout_id;
|
||||
$db = &DB();
|
||||
$q = "SELECT * FROM ".AGILE_DB_PREFIX."checkout WHERE site_id=".DEFAULT_SITE." AND id=".$db->qstr($checkout_id);
|
||||
$rs = $db->Execute($q);
|
||||
if($rs && $rs->RecordCount()) {
|
||||
@$this->cfg = unserialize($rs->fields["plugin_data"]);
|
||||
$this->flds = $rs->fields;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get country name,
|
||||
*
|
||||
* @param string $field name, two_code, or three_code
|
||||
*/
|
||||
function getCountry($field, $country_id) {
|
||||
$db = &DB();
|
||||
$sql= 'SELECT '.$field.' FROM '.AGILE_DB_PREFIX.'country WHERE site_id='.DEFAULT_SITE.' AND id='.$country_id;
|
||||
$rs = $db->Execute($sql);
|
||||
if($rs == false || $rs->RecordCount() == 0)
|
||||
return "Not Defined";
|
||||
else
|
||||
return $rs->fields["$field"];
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate the current currency is allowed
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function validate_currency($currency_iso) {
|
||||
$do = false;
|
||||
for($i=0; $i<count($this->support_cur); $i++)
|
||||
if ($currency_iso == $this->support_cur[$i])
|
||||
$do = true;
|
||||
if ( !$do ) {
|
||||
global $C_list, $C_translate;
|
||||
$C_translate->value['checkout']['currency'] = $C_list->currency_iso(DEFAULT_CURRENCY);
|
||||
$msg = $C_translate->translate('currency_not_supported','checkout','');
|
||||
$this->redirect='<script language=Javascript> alert(\''.$msg.'\');';
|
||||
if($this->type=='redirect') $this->redirect.= ' history.back();';
|
||||
$this->redirect.='</script>';
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate the current credit card details
|
||||
*/
|
||||
function validate_card_details(&$ret) {
|
||||
|
||||
// validate input fields
|
||||
if($this->req_all_flds) $this->req_fields_arr = Array('first_name','last_name', 'address1', 'state', 'zip');
|
||||
if (is_array($this->req_fields_arr)) {
|
||||
$validate=true;
|
||||
global $VAR;
|
||||
foreach($this->req_fields_arr as $fld) {
|
||||
if(empty($this->billing["$fld"]) && empty($this->account["$fld"]) ) {
|
||||
$VAR["{$fld}_error"]=true;
|
||||
$validate=false;
|
||||
}
|
||||
}
|
||||
if(!$validate) {
|
||||
global $C_translate;
|
||||
$ret['status'] = 0;
|
||||
$ret['msg'] = $C_translate->translate('missing_fields','checkout','');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// validate actual credit card details
|
||||
include_once(PATH_CORE . 'validate.inc.php');
|
||||
$validate = new CORE_validate;
|
||||
$this->billing["cc_no"] == ereg_replace('^[0-9]', '', $this->billing["cc_no"]);
|
||||
if (!$validate->validate_cc( $this->billing["cc_no"], false, $this->billing["card_type"], $this->cfg['card_type'] )) {
|
||||
$ret['status'] = 0;
|
||||
global $C_translate;
|
||||
$ret['msg'] = $C_translate->translate('card_invalid','checkout','');
|
||||
} elseif (!$validate->validate_cc_exp(@$this->billing["exp_month"],@$this->billing["exp_year"])) {
|
||||
$ret['status'] = 0;
|
||||
global $C_translate;
|
||||
$ret['msg'] = $C_translate->translate('card_exp_invalid','checkout','');
|
||||
} else {
|
||||
$ret['status'] = 1;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Validate the current eft card details
|
||||
*/
|
||||
function validate_eft_details(&$ret) {
|
||||
// validate input fields
|
||||
if($this->req_all_flds) $this->req_fields_arr = Array('first_name','last_name', 'address1', 'city', 'state', 'zip', 'eft_check_acct_type', 'eft_trn', 'eft_check_acct', 'phone');
|
||||
if (is_array($this->req_fields_arr)) {
|
||||
$validate=true;
|
||||
global $VAR;
|
||||
foreach($this->req_fields_arr as $fld) {
|
||||
if(empty($this->billing["$fld"]) && empty($this->account["$fld"]) ) {
|
||||
$VAR["{$fld}_error"]=true;
|
||||
$validate=false;
|
||||
}
|
||||
}
|
||||
if(!$validate) {
|
||||
global $C_translate;
|
||||
$ret['status'] = 0;
|
||||
$ret['msg'] = $C_translate->translate('missing_fields','checkout','');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
$ret['status'] = 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the redirect URL and form values
|
||||
*
|
||||
* @param string $url
|
||||
* @param string $vals
|
||||
*/
|
||||
function post_vars($url,$vals) {
|
||||
$ret = '<form name="checkout_redirect" method="post" action="'.$url.'" target="_parent">';
|
||||
foreach($vals as $v)
|
||||
$ret .='<input type="hidden" name="'.$v[0].'" value="'.$v[1].'">';
|
||||
$ret .= '<script language="JavaScript">document.checkout_redirect.submit();</script>';
|
||||
$this->redirect=$ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set array for processing order with a stored billing record
|
||||
* "getStoredArray"
|
||||
*/
|
||||
function setBillingFromDB($account_id, $account_billing_id, $checkout_plugin_id,$rebilling=false) {
|
||||
$db=&DB();
|
||||
$ccrs=$db->Execute($sql=sqlSelect($db,"account_billing","*","account_id=::$account_id:: AND id=::$account_billing_id:: AND checkout_plugin_id=::$checkout_plugin_id::"));
|
||||
return $this->setBillingFromDBObj($ccrs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get stored array by passing in database object
|
||||
*/
|
||||
function setBillingFromDBObj(&$ccrs,$rebilling=false) {
|
||||
if($ccrs && $ccrs->RecordCount()) {
|
||||
|
||||
// account fields
|
||||
if(empty($ccrs->fields['address1'])) {
|
||||
if(!$this->setAccountFromDB($ccrs->fields['account_id'])) return false;
|
||||
} else {
|
||||
$this->account = Array(
|
||||
'first_name'=> $ccrs->fields['first_name'],
|
||||
'last_name'=> $ccrs->fields['last_name'],
|
||||
'company'=> $ccrs->fields['company'],
|
||||
'address1'=> $ccrs->fields['address1'],
|
||||
'address2'=> $ccrs->fields['address2'],
|
||||
'city'=> $ccrs->fields['city'],
|
||||
'state'=> $ccrs->fields['state'],
|
||||
'zip'=> $ccrs->fields['zip'],
|
||||
'country_id'=> $ccrs->fields['country_id'],
|
||||
'phone'=> $ccrs->fields['phone'],
|
||||
'company' => $ccrs->fields['company'],
|
||||
'email' => $ccrs->fields['email']
|
||||
);
|
||||
}
|
||||
|
||||
// get the card or eft details & decrypt
|
||||
include_once(PATH_CORE.'crypt.inc.php');
|
||||
$this->billing['card_type'] = $ccrs->fields['card_type'];
|
||||
$this->billing['rebilling'] = $rebilling;
|
||||
if($this->eft || $ccrs->fields['card_type']=='eft') {
|
||||
// stored eft
|
||||
$this->billing['eft_check_acct_type'] = $ccrs->fields['eft_check_acct_type'];
|
||||
$this->billing['eft_check_checkno'] = false;
|
||||
$this->billing['eft_check_acct'] = CORE_decrypt($ccrs->fields['eft_check_acct']);
|
||||
$this->billing['eft_trn'] = CORE_decrypt($ccrs->fields['eft_trn']);
|
||||
if(!empty($ccrs->fields['ssn'])) $this->billing['ssn'] = CORE_decrypt($ccrs->fields['ssn']);
|
||||
if(!empty($ccrs->fields['dob'])) $this->billing['dob'] = CORE_decrypt($ccrs->fields['dob']);
|
||||
if(!empty($ccrs->fields['dl_no'])) $this->billing['dl_no'] = CORE_decrypt($ccrs->fields['dl_no']);
|
||||
} else {
|
||||
// stored card
|
||||
$this->billing['cc_no'] = CORE_decrypt($ccrs->fields['card_num']);
|
||||
$this->billing['exp_month'] = $ccrs->fields['card_exp_month'];
|
||||
$this->billing['exp_year'] = $ccrs->fields['card_exp_year'];
|
||||
}
|
||||
|
||||
/* write back params to global */
|
||||
$this->setBillingParams();
|
||||
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set account from account db table
|
||||
*/
|
||||
function setAccountFromDB($id) {
|
||||
$db=&DB();
|
||||
$rs = $db->Execute(sqlSelect($db,"account","first_name,last_name,company,address1,address2,city,state,zip,country_id","id=::$id::"));
|
||||
if($rs&&$rs->RecordCount()) {
|
||||
$this->account = $rs->fields;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set account and billing details from $VAR (user params)
|
||||
*/
|
||||
function setBillingFromParams($VAR) {
|
||||
global $VAR;
|
||||
@$a = $VAR['checkout_plugin_data'];
|
||||
|
||||
@$this->billing = Array(
|
||||
'card_type' => $a['card_type'],
|
||||
'cc_no' => $a['cc_no'],
|
||||
'ccv' => $a['ccv'],
|
||||
'exp_month' => $a['exp_month'],
|
||||
'exp_year' => $a['exp_year'],
|
||||
'eft_check_acct_type' => $a['eft_check_acct_type'],
|
||||
'eft_check_checkno' => $a['eft_check_checkno'],
|
||||
'eft_check_acct' => $a['eft_check_acct'],
|
||||
'eft_trn' => $a['eft_trn'],
|
||||
'ssn' => $a['ssn'],
|
||||
'dob' => $a['dob'],
|
||||
'dl_no' => $a['dl_no']
|
||||
);
|
||||
|
||||
@$this->account = Array(
|
||||
'first_name' => stripslashes($a['first_name']),
|
||||
'last_name' => stripslashes($a['last_name']),
|
||||
'address1' => stripslashes($a['address1']),
|
||||
'address2' => stripslashes($a['address2']),
|
||||
'city' => stripslashes($a['city']),
|
||||
'state' => stripslashes($a['state']),
|
||||
'zip' => stripslashes($a['zip']),
|
||||
'country_id' => stripslashes($a['country_id']),
|
||||
'phone' => stripslashes($a['phone']),
|
||||
'company' => stripslashes($a['company']),
|
||||
'email' => stripslashes($a['email'])
|
||||
);
|
||||
|
||||
/* write back params for global */
|
||||
$this->setBillingParams();
|
||||
}
|
||||
|
||||
/**
|
||||
* Write the vars back to the global VAR for availibilty on the checkout plugin templates
|
||||
*/
|
||||
function setBillingParams() {
|
||||
global $VAR;
|
||||
foreach($this->billing as $key=>$val) $VAR["$key"]=$val;
|
||||
foreach($this->account as $key=>$val) $VAR["$key"]=$val;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Store the billing credit card entered
|
||||
*/
|
||||
function saveCreditCardDetails($VAR) {
|
||||
global $C_auth;
|
||||
if(!empty($VAR['account_id']) && $C_auth->auth_method_by_name('checkout','admin_checkoutnow'))
|
||||
$account_id=$VAR['account_id'];
|
||||
else
|
||||
$account_id=SESS_ACCOUNT;
|
||||
|
||||
# Check if this card is already on file:
|
||||
$last_four = substr($this->billing['cc_no'],(strlen($this->billing['cc_no'])-4),4);
|
||||
$db = &DB();
|
||||
$q = "SELECT id,card_exp_month,card_exp_year FROM ".AGILE_DB_PREFIX."account_billing WHERE
|
||||
site_id = ".$db->qstr(DEFAULT_SITE) ." AND
|
||||
account_id = ".$db->qstr($account_id) ." AND
|
||||
card_num4 = ".$db->qstr($last_four) ." AND
|
||||
checkout_plugin_id = ".$db->qstr($this->checkout_id) ." AND
|
||||
card_type = ".$db->qstr($this->billing['card_type']);
|
||||
$rs = $db->Execute($q);
|
||||
if($rs && $rs->RecordCount()) {
|
||||
$fields=Array('card_exp_month'=>$this->billing['exp_month'], 'card_exp_year'=>$this->billing['exp_year']);
|
||||
$db->Execute(sqlUpdate($db,"account_billing",$fields,"id = {$rs->fields['id']}"));
|
||||
return $rs->fields['id'];
|
||||
}
|
||||
|
||||
include_once(PATH_CORE.'crypt.inc.php');
|
||||
$card_num = CORE_encrypt ($this->billing['cc_no']);
|
||||
$id = $db->GenID(AGILE_DB_PREFIX . 'account_billing_id');
|
||||
$sql = "INSERT INTO ".AGILE_DB_PREFIX."account_billing SET
|
||||
id = " . $db->qstr($id) . ",
|
||||
site_id = " . $db->qstr(DEFAULT_SITE) . ",
|
||||
account_id = " . $db->qstr(@$account_id) . ",
|
||||
checkout_plugin_id = " . $db->qstr(@$this->checkout_id) . ",
|
||||
card_type = " . $db->qstr(@$this->billing['card_type']) . ",
|
||||
card_num = " . $db->qstr(@$card_num) . ",
|
||||
card_num4 = " . $db->qstr(@$last_four) . ",
|
||||
card_exp_month = " . $db->qstr(@$this->billing['exp_month']) . ",
|
||||
card_exp_year = " . $db->qstr(@$this->billing['exp_year']) . ",
|
||||
card_start_month = " . $db->qstr(@$this->billing['start_month']) . ",
|
||||
card_start_year = " . $db->qstr(@$this->billing['start_year']) . ",
|
||||
first_name = " . $db->qstr(@$this->account['first_name']) . ",
|
||||
last_name = " . $db->qstr(@$this->account['last_name']) . ",
|
||||
address1 = " . $db->qstr(@$this->account['address1']) . ",
|
||||
address2 = " . $db->qstr(@$this->account['address2']) . ",
|
||||
city = " . $db->qstr(@$this->account['city']) . ",
|
||||
state = " . $db->qstr(@$this->account['state']) . ",
|
||||
zip = " . $db->qstr(@$this->account['zip']) . ",
|
||||
country_id = " . $db->qstr(@$this->account['country_id']) . ",
|
||||
phone = " . $db->qstr(@$this->account['phone']) . ",
|
||||
email = " . $db->qstr(@$this->account['email']) . ",
|
||||
company = " . $db->qstr(@$this->account['company']) ;
|
||||
$result = $db->Execute($sql);
|
||||
if ($result) return $id;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Store the billing EFT details entered
|
||||
*/
|
||||
function saveEFTDetails($VAR) {
|
||||
global $C_auth;
|
||||
if(!empty($VAR['account_id']) && $C_auth->auth_method_by_name('checkout','admin_checkoutnow'))
|
||||
$account_id=$VAR['account_id'];
|
||||
else
|
||||
$account_id=SESS_ACCOUNT;
|
||||
|
||||
# Check if this card is already on file:
|
||||
$last_four = substr($this->billing['eft_check_acct'],(strlen($this->billing['eft_check_acct']) - 4),4);
|
||||
$db = &DB();
|
||||
$q = "SELECT id,card_exp_month,card_exp_year FROM ".AGILE_DB_PREFIX."account_billing WHERE
|
||||
site_id = ".$db->qstr(DEFAULT_SITE) ." AND
|
||||
account_id = ".$db->qstr($account_id) ." AND
|
||||
card_num4 = ".$db->qstr($last_four) ." AND
|
||||
checkout_plugin_id = ".$db->qstr($this->checkout_id) ." AND
|
||||
card_type = ".$db->qstr($this->billing['card_type']);
|
||||
$rs = $db->Execute($q);
|
||||
if($rs && $rs->RecordCount()) {
|
||||
return $rs->fields['id'];
|
||||
}
|
||||
|
||||
include_once(PATH_CORE.'crypt.inc.php');
|
||||
$ssn=false;
|
||||
$dob=false;
|
||||
$dl_no=false;
|
||||
if(!empty($this->billing['dob'])) $dob = CORE_encrypt ($this->billing['dob']);
|
||||
if(!empty($this->billing['ssn'])) $ssn = CORE_encrypt ($this->billing['ssn']);
|
||||
if(!empty($this->billing['dl_no'])) $dl_no = CORE_encrypt ($this->billing['dl_no']);
|
||||
$check_acct = CORE_encrypt ($this->billing['eft_check_acct']);
|
||||
$trn = CORE_encrypt ($this->billing['eft_trn']);
|
||||
|
||||
$id = $db->GenID(AGILE_DB_PREFIX . 'account_billing_id');
|
||||
$sql = "INSERT INTO ".AGILE_DB_PREFIX."account_billing SET
|
||||
id = " . $db->qstr($id) . ",
|
||||
site_id = " . $db->qstr(DEFAULT_SITE) . ",
|
||||
account_id = " . $db->qstr($account_id) . ",
|
||||
checkout_plugin_id = " . $db->qstr($this->checkout_id) . ",
|
||||
card_num4 = " . $db->qstr($last_four) . ",
|
||||
card_type = " . $db->qstr(@$this->billing['card_type']) . ",
|
||||
eft_check_checkno = " . $db->qstr($this->billing['eft_check_checkno']) . ",
|
||||
eft_check_acct_type = " . $db->qstr($this->billing['eft_check_acct_type']) . ",
|
||||
eft_trn = " . $db->qstr($trn) . ",
|
||||
eft_check_acct = " . $db->qstr($check_acct) . ",
|
||||
dob = " . $db->qstr($dob) . ",
|
||||
dl_no = " . $db->qstr($dl_no) . ",
|
||||
ssn = " . $db->qstr($ssn) . ",
|
||||
first_name = " . $db->qstr(@$this->account['first_name']) . ",
|
||||
last_name = " . $db->qstr(@$this->account['last_name']) . ",
|
||||
address1 = " . $db->qstr(@$this->account['address1']) . ",
|
||||
address2 = " . $db->qstr(@$this->account['address2']) . ",
|
||||
city = " . $db->qstr(@$this->account['city']) . ",
|
||||
state = " . $db->qstr(@$this->account['state']) . ",
|
||||
zip = " . $db->qstr(@$this->account['zip']) . ",
|
||||
country_id = " . $db->qstr(@$this->account['country_id']) . ",
|
||||
phone = " . $db->qstr(@$this->account['phone']) . ",
|
||||
email = " . $db->qstr(@$this->account['email']) . ",
|
||||
company = " . $db->qstr(@$this->account['company']);
|
||||
$result = $db->Execute($sql);
|
||||
if ($result) return $id;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
?>
|
Reference in New Issue
Block a user