* @package AgileBill
* @version 1.4.93
*/
class import_plugin extends import
{
function import_plugin()
{
# Configure the location of the dreamaccount salt file:
$this->salt = PATH_AGILE . 'salt.php';
# Configure the database name, host, and login:
$this->host = 'localhost';
$this->db = '';
$this->user = '';
$this->pass = '';
$this->type = 'mysql';
# If importing CC details, enter the gateway plugin to use for recurring charges:
$this->gateway = 'AUTHORIZE_NET';
# Do not change anything past this line:
$this->name = 'DreamAccount';
$this->plugin = 'DreamAccount';
$this->select_limit = 50;
$this->instructions = 'Preliminary Instructions:
Open '. __FILE__ .' and edit the
database and salt file settings...
If you will be importing credit card details, paste the Checkout Plugin
name from the checkout plugin list page to the "$this->gateway" value
that will be used to process all recurring charges...
this should be a gateway such as AUTHORIZE_NET or
LINKPOINT.
';
$this->actions[] = Array ( 'name' => 'test',
'desc' => 'Step 1: Test the database connection',
'depn' => false );
$this->actions[] = Array ( 'name' => 'accounts',
'desc' => 'Step 2: Import the DreamAccount accounts',
'depn' => Array('test') );
$this->actions[] = Array ( 'name' => 'billing',
'desc' => 'Step 3: Import the DreamAccount account billing details',
'depn' => Array('accounts') );
$this->actions[] = Array ( 'name' => 'categories',
'desc' => 'Step 4: Import the DreamAccount product categories',
'depn' => Array('accounts') );
$this->actions[] = Array ( 'name' => 'directory',
'desc' => 'Step 5: Import the DreamAccount protected directories',
'depn' => Array('accounts') );
$this->actions[] = Array ( 'name' => 'products',
'desc' => 'Step 6: Import the DreamAccount product definitions',
'depn' => Array('accounts','directory','categories') );
$this->actions[] = Array ( 'name' => 'invoices',
'desc' => 'Step 7: Import the DreamAccount invoices',
'depn' => Array('accounts','directory','categories','products') );
$this->actions[] = Array ( 'name' => 'services',
'desc' => 'Step 8: Import the DreamAccount subscriptions',
'depn' => Array('accounts','directory','categories','products','invoices') );
$this->actions[] = Array ( 'name' => 'notes',
'desc' => 'Step 9: Import the DreamAccount notes for services, accounts, and invoices',
'depn' => Array('accounts','services','invoices') );
}
# test remote database connectivity
function test()
{
### Connect to the remote Db;
$dbr = &NewADOConnection($this->type);
$dbr->Connect($this->host, $this->user, $this->pass, $this->db);
global $C_debug, $VAR;
if(!empty($dbr->_errorMsg))
{
$C_debug->alert('Failed: ' . $dbr->_errorMsg);
}
else
{
$C_debug->alert('Connected OK!');
# Write success to database
$db = &DB();
$id = $db->GenID(AGILE_DB_PREFIX.'import_id');
$sql = "INSERT INTO ".AGILE_DB_PREFIX."import
SET
id = $id,
site_id = ".DEFAULT_SITE.",
date_orig = ".time().",
plugin = ".$db->qstr($VAR['plugin']).",
action = ".$db->qstr($VAR['action']);
$db->Execute($sql);
}
# return to main import page
echo "";
}
# import the account and billing details
function accounts()
{
global $VAR, $C_debug;
$p = AGILE_DB_PREFIX;
$s = DEFAULT_SITE;
### Connect to the remote Db;
$dbr = &NewADOConnection($this->type);
$dbr->Connect($this->host, $this->user, $this->pass, $this->db);
### Determine the offset for the account
if(empty($VAR['offset'])) $VAR['offset'] = 0;
@$offset = $VAR['offset'].",".$this->select_limit;
# select each account from Dreamaccount
$sql = "SELECT * FROM account";
$rs = $dbr->SelectLimit($sql, $this->select_limit, $VAR['offset']);
if($rs === false) {
$C_debug->alert("Query to the table 'account' failed!");
return false;
}
if($rs->RecordCount() == 0) {
$C_debug->alert("No more records to process!");
echo "";
return;
}
$msg = "Processing ".$rs->RecordCount()." Records...
";
# loop through each remote account
while(!$rs->EOF)
{
$msg.= "
Processing account: {$rs->fields['account_username']}...";
# start a new transaction for the insert:
$db = &DB();
$db->StartTrans();
# Get a local account id
$id = $db->GenID($p.'account_id');
# Get orig date
if(!empty($rs->fields['orig_date'])) {
$date = explode('-', $rs->fields['orig_date']);
$date_orig = mktime(0,0,0,$date[1], $date[2], $date[0]);
} else {
$date_orig = time();
}
# Get the first/last name
$name = explode(' ', $rs->fields['account_name']);
@$firstn = $name[0];
@$c = count($name) -1;
@$lastn = $name[$c];
# Insert the account
$sql = "INSERT INTO {$p}account SET
id = $id,
site_id = $s,
date_orig = $date_orig,
date_last = ".time().",
language_id = ".$db->qstr(DEFAULT_LANGUAGE).",
currency_id = ".DEFAULT_CURRENCY.",
theme_id = ".$db->qstr(DEFAULT_THEME).",
username = ".$db->qstr($rs->fields['account_username']).",
password = ".$db->qstr(md5($rs->fields['account_password'])).",
status = 1,
country_id = {$rs->fields['account_country']},
first_name = ".$db->qstr($firstn).",
last_name = ".$db->qstr($lastn).",
company = ".$db->qstr($rs->fields['account_company']).",
address1 = ".$db->qstr($rs->fields['account_address']).",
city = ".$db->qstr($rs->fields['account_city']).",
state = ".$db->qstr($rs->fields['account_state']).",
zip = ".$db->qstr($rs->fields['account_zip']).",
email = ".$db->qstr($rs->fields['account_email']).",
email_type = 0";
$db->Execute($sql);
# Insert the import record
$this->import_transaction($this->plugin, $VAR['action'], 'account', $id, 'account', $rs->fields['account_id'], &$db);
# Complete the transaction
$db->CompleteTrans();
$rs->MoveNext();
}
$C_debug->alert($msg);
$offset = $VAR['offset'] + $this->select_limit;
echo "";
}
### Import the billing details for each account
function billing()
{
global $VAR, $C_debug;
$p = AGILE_DB_PREFIX;
$s = DEFAULT_SITE;
# validate the salt file...
if(!is_file($this->salt)) {
$C_debug->alert('The path to the salt file set in the plugin script '. __FILE__.' is incorrect');
return;
}
### Determine the offset for the account
if(empty($VAR['offset'])) $VAR['offset'] = 0;
@$offset = $VAR['offset'].",".$this->select_limit;
### Select from the imported accounts
$db = &DB();
$sql = "SELECT * FROM {$p}import WHERE
plugin = '{$this->plugin}' AND
action = 'accounts' AND
ab_table = 'account' AND
site_id = $s";
$rs = $db->SelectLimit($sql, $offset);
if($rs === false) {
$C_debug->alert("Query to the table 'import' failed!");
return false;
}
if($rs->RecordCount() == 0) {
$C_debug->alert("No more records to process!");
echo "";
return;
}
### Include AB Encryption class:
include_once(PATH_CORE.'crypt.inc.php');
### Get the default checkout plugin id:
$sql = "SELECT id FROM {$p}checkout WHERE
site_id = $s AND
checkout_plugin = '{$this->gateway}'";
$ch = $db->Execute($sql);
$checkout_plugin_id = $ch->fields['id'];
$msg = "Processing ".$rs->RecordCount()." Records...
";
# loop through each remote billing record
while(!$rs->EOF)
{
$msg.= "
Processing Account Id: {$rs->fields['ab_id']}...";
# start a new transaction for the insert:
$db->StartTrans();
# Get the local account id
$ab_account_id = $rs->fields['ab_id'];
$remote_account_id = $rs->fields['remote_id'];
# Connect to the remote DB and get all billing records for this
# account, where the cc_num is not blank
$dbr = &NewADOConnection($this->type);
$dbr->Connect($this->host, $this->user, $this->pass, $this->db);
$sql = "SELECT * FROM billing WHERE
billing_account_id = $remote_account_id AND
billing_cc_num != ''";
$billing = $dbr->Execute($sql);
if($billing != false && $billing->RecordCount() > 0)
{
while(!$billing->EOF)
{
# Get local billing id
$db = &DB();
$id = $db->GenID($p.'account_billing_id');
# Decrypt the remote CC
$cc_num_plain = $this->RC4($billing->fields['billing_cc_num'], 'de');
# Encrypt to local algorythm
$card_num = CORE_encrypt ($cc_num_plain);
# get the last 4 digits:
$last_four = eregi_replace('^............', '', $cc_num_plain);
# Identify the card type:
$card_type = $this->cc_identify($cc_num_plain);
# Get the month & year
$exp = explode('20', trim($billing->fields['billing_cc_exp']));
$exp_month = @$exp[0];
$exp_year = @$exp[1];
if($card_type != '')
{
# Start transaction
$db->StartTrans();
# Insert local billing record
$sql = "INSERT INTO {$p}account_billing SET
id = $id,
site_id = $s,
account_id = $ab_account_id,
checkout_plugin_id = $checkout_plugin_id,
card_type = '$card_type',
card_num = ".$db->qstr($card_num).",
card_num4 = '$last_four',
card_exp_month = '$exp_month',
card_exp_year = '$exp_year'";
$db->Execute($sql);
# Insert the import record
$this->import_transaction($VAR['plugin'], $VAR['action'], 'account_billing', $id, 'billing', $billing->fields['billing_id'], &$db);
# Complete the transaction
$db->CompleteTrans();
}
$billing->MoveNext();
}
}
$rs->MoveNext();
}
$C_debug->alert($msg);
$offset = $VAR['offset'] + $this->select_limit;
echo "";
}
# Import any categories
function categories()
{
global $VAR, $C_debug;
$p = AGILE_DB_PREFIX;
$s = DEFAULT_SITE;
### Connect to the remote Db;
$dbr = &NewADOConnection($this->type);
$dbr->Connect($this->host, $this->user, $this->pass, $this->db);
### Determine the offset for the account
if(empty($VAR['offset'])) $VAR['offset'] = 0;
@$offset = $VAR['offset'].",".$this->select_limit;
# select each account from Dreamaccount
$sql = "SELECT * FROM category";
$rs = $dbr->SelectLimit($sql, $this->select_limit, $VAR['offset']);
if($rs === false) {
$C_debug->alert("Query to the table 'category' failed!");
return false;
}
if($rs->RecordCount() == 0) {
$C_debug->alert("No more records to process!");
echo "";
return;
}
$msg = "Processing ".$rs->RecordCount()." Records...
";
# loop through each remote account
while(!$rs->EOF)
{
$msg.= "
Processing category: {$rs->fields['name']}...";
# start a new transaction for the insert:
$db = &DB();
$db->StartTrans();
# Get a local id
$id = $db->GenID($p.'product_cat_id');
# Insert the record
$sql = "INSERT INTO {$p}product_cat SET
id = $id,
site_id = $s,
name = ".$db->qstr($rs->fields['name']).",
notes = ".$db->qstr($rs->fields['description']).",
status = 1,
template = 1,
position = 1";
$db->Execute($sql);
# Insert the import record
$this->import_transaction($this->plugin, $VAR['action'], 'product_cat', $id, 'categories', $rs->fields['id'], &$db);
# Get a local id
$idx = $db->GenID($p.'product_cat_translate_id');
# Insert the translation
$sql = "INSERT INTO {$p}product_cat_translate SET
id = $id,
site_id = $s,
product_cat_id = $id,
language_id = ".$db->qstr(DEFAULT_LANGUAGE).",
name = ".$db->qstr($rs->fields['name']).",
description = ".$db->qstr($rs->fields['description']);
$db->Execute($sql);
# Insert the import record
$this->import_transaction($this->plugin, $VAR['action'], 'product_cat_translate', $idx, 'categories', $rs->fields['id'], &$db);
# Complete the transaction
$db->CompleteTrans();
$rs->MoveNext();
}
$C_debug->alert($msg);
$offset = $VAR['offset'] + $this->select_limit;
echo "";
}
# Import any groups, htaccess groups, and directories
function directory()
{
global $VAR, $C_debug;
$p = AGILE_DB_PREFIX;
$s = DEFAULT_SITE;
### Connect to the remote Db;
$dbr = &NewADOConnection($this->type);
$dbr->Connect($this->host, $this->user, $this->pass, $this->db);
### Determine the offset for the account
if(empty($VAR['offset'])) $VAR['offset'] = 0;
@$offset = $VAR['offset'].",".$this->select_limit;
# select each account from Dreamaccount
$sql = "SELECT * FROM directory";
$rs = $dbr->SelectLimit($sql, $this->select_limit, $VAR['offset']);
if($rs === false) {
$C_debug->alert("Query to the table 'directory' failed!");
return false;
}
if($rs->RecordCount() == 0) {
$C_debug->alert("No more records to process!");
echo "";
return;
}
$msg = "Processing ".$rs->RecordCount()." Records...
";
# loop through each remote account
while(!$rs->EOF)
{
$msg.= "
Processing protected directory: {$rs->fields['directory_name']}...";
# start a new transaction for the insert:
$db = &DB();
$db->StartTrans();
# Get a local id
$id = $db->GenID($p.'group_id');
# Insert the record
$sql = "INSERT INTO {$p}group SET
id = $id,
site_id = $s,
date_orig = 0,
date_start = 0,
date_expire = 0,
status = 1,
parent_id = 2,
pricing = 0,
name = ".$db->qstr($rs->fields['directory_name']).",
notes = ".$db->qstr('Imported from DreamAccount');
$db->Execute($sql);
# Insert the import record
$this->import_transaction($this->plugin, $VAR['action'], 'group', $id, 'directory', $rs->fields['directory_id'], &$db);
# add access to the new group from the users account:
$record_id = $db->GenID(AGILE_DB_PREFIX . 'account_group_id');
$sql= "INSERT INTO ". AGILE_DB_PREFIX ."account_group SET
id = ".$db->qstr($record_id).",
site_id = ".$db->qstr(DEFAULT_SITE).",
date_orig = ".$db->qstr(time()).",
date_expire = ".$db->qstr('0').",
group_id = ".$db->qstr($id).",
account_id = ".$db->qstr(SESS_ACCOUNT).",
active = ".$db->qstr(1);
$result = $db->Execute($sql);
$this->import_transaction($this->plugin, $VAR['action'], 'account_group', $record_id, 'directory', $rs->fields['directory_id'], &$db);
# update the current user's authentication so the newly added group appears
# as available to them
global $C_auth;
$C_auth->auth_update();
if($rs->fields['directory_type'])
{
### Create HTACCESS GROUP
global $C_list;
if($C_list->is_installed('htaccess'))
{
# Get a local id
$idx = $db->GenID($p.'htaccess_id');
# Insert the record
$sql = "INSERT INTO {$p}htaccess SET
id = $idx,
site_id = $s,
status = 1,
group_avail = ".$db->qstr( serialize ( Array($id,1001)) ).",
name = ".$db->qstr($rs->fields['directory_name']).",
description = ".$db->qstr('Imported from DreamAccount');
$db->Execute($sql);
# Insert the import record
$this->import_transaction($this->plugin, $VAR['action'], 'htaccess', $idx, 'directory', $rs->fields['directory_id'], &$db);
if($rs->fields['directory_type'] == '0')
{
# Get a local id
$idxx = $db->GenID($p.'htaccess_dir_id');
# Insert the record
$sql = "INSERT INTO {$p}htaccess_dir SET
id = $idxx,
site_id = $s,
htaccess_id = $idx,
status = 1,
type = 1,
recursive = 1,
url = ".$db->qstr($rs->fields['directory_url']).",
path = ".$db->qstr($rs->fields['directory_path']).",
name = ".$db->qstr($rs->fields['directory_name']).",
description = ".$db->qstr('Imported from DreamAccount');
$db->Execute($sql);
# Insert the import record
$this->import_transaction($this->plugin, $VAR['action'], 'htaccess_dir', $idxx, 'directory', $rs->fields['directory_id'], &$db);
}
}
}
# Complete the transaction
$db->CompleteTrans();
$rs->MoveNext();
}
$C_debug->alert($msg);
$offset = $VAR['offset'] + $this->select_limit;
echo "";
}
# Import any products
function products()
{
global $VAR, $C_debug;
$p = AGILE_DB_PREFIX;
$s = DEFAULT_SITE;
### Connect to the remote Db;
$dbr = &NewADOConnection($this->type);
$dbr->Connect($this->host, $this->user, $this->pass, $this->db);
### Determine the offset for the account
if(empty($VAR['offset'])) $VAR['offset'] = 0;
@$offset = $VAR['offset'].",".$this->select_limit;
# select each product from Dreamaccount that is NOT a trial
$sql = "SELECT * FROM membership ORDER BY trial ASC";
$rs = $dbr->SelectLimit($sql, $this->select_limit, $VAR['offset']);
if($rs === false) {
$C_debug->alert("Query to the table 'membership' failed!");
return false;
}
if($rs->RecordCount() == 0) {
$C_debug->alert("No more records to process!");
echo "";
return;
}
$msg = "Processing ".$rs->RecordCount()." Records...
";
# loop through each remote account
while(!$rs->EOF)
{
$msg.= "
Processing Product: {$rs->fields['membership_name']}...";
# start a new transaction for the insert:
$db = &DB();
$db->StartTrans();
if($rs->fields['membership_active'] == "Y")
$status = 1;
else
$status = 0;
# get category
$sql = "SELECT ab_id FROM {$p}import WHERE site_id = {$s} AND
action = 'categories' AND
plugin = '{$this->plugin}' AND
remote_id = '{$rs->fields['category']}'";
$cat = $db->Execute($sql);
$categories = serialize ( Array( $cat->fields['ab_id'] ) );
# price type (trial, one-time, recurring)
if($rs->fields['trial'] == "Y")
{
# trial
$price_type = '2';
} elseif($rs->fields['membership_recurring'] == "Y") {
# recurring
$price_type = '1';
} else {
# one-time
$price_type = '0';
}
# defaults for 'recurring' product
if($price_type == "1")
{
# Determine the recurring schedule:
$freq = $rs->fields['membership_frequency'];
if ($freq=="7") { $price_recurr_schedule = "0"; } // weekly
elseif ($freq=="14") { $price_recurr_schedule = "0"; } // Bi-Weekly
elseif ($freq=="30") { $price_recurr_schedule = "1"; } // Monthly
elseif ($freq=="31") { $price_recurr_schedule = "1"; } // Monthly
elseif ($freq=="60") { $price_recurr_schedule = "1"; } // Bi-Monthly
elseif ($freq=="90") { $price_recurr_schedule = "2"; } // Quarterly
elseif ($freq=="180") { $price_recurr_schedule = "3"; } // Semi-Annually
elseif ($freq=="360") { $price_recurr_schedule = "4"; } // Annually
elseif ($freq=="365") { $price_recurr_schedule = "4"; } // Annually
else { $price_recurr_schedule = '1'; } // monthly
$price_recurr_type = "0";
$price_recurr_week = "1";
$price_recurr_weekday = "1";
$price_recurr_default = $price_recurr_schedule;
# Set default recurring prices: (monthly only)
$sql = 'SELECT id FROM ' . AGILE_DB_PREFIX . 'group WHERE
site_id = ' . $db->qstr(DEFAULT_SITE) . ' AND
pricing = ' . $db->qstr('1');
$rsg = $db->Execute($sql);
while(!$rsg->EOF) {
$i = $rsg->fields['id'];
$recur_price[0][$i]['price_base'] = $rs->fields['membership_price'];
$recur_price[0][$i]['price_setup'] = $rs->fields['membership_setup'];
@$recur_price[1][$i]['price_base'] = $rs->fields['membership_price'];
@$recur_price[1][$i]['price_setup']= $rs->fields['membership_setup'];
$recur_price[2][$i]['price_base'] = $rs->fields['membership_price'];
$recur_price[2][$i]['price_setup'] = $rs->fields['membership_setup'];
$recur_price[3][$i]['price_base'] = $rs->fields['membership_price'];
$recur_price[3][$i]['price_setup'] = $rs->fields['membership_setup'];
$recur_price[4][$i]['price_base'] = $rs->fields['membership_price'];
$recur_price[4][$i]['price_setup'] = $rs->fields['membership_setup'];
$recur_price[5][$i]['price_base'] = $rs->fields['membership_price'];
$recur_price[5][$i]['price_setup'] = $rs->fields['membership_setup'];
$rsg->MoveNext();
}
$recur_price[0]['show'] = "0";
$recur_price[1]['show'] = "0";
$recur_price[2]['show'] = "0";
$recur_price[3]['show'] = "0";
$recur_price[4]['show'] = "0";
$recur_price[5]['show'] = "0";
$recur_price[$price_recurr_schedule]['show'] = "1";
}
# defaults for trial products
if($price_type == "2")
{
# get trial plan id
$sql = "SELECT ab_id FROM {$p}import WHERE site_id = {$s} AND
action = 'product' AND
plugin = '{$this->plugin}' AND
remote_id = '{$rs->fields['trial_plan']}'";
$cat = $db->Execute($sql);
$price_trial_prod = serialize ( Array( $cat->fields['ab_id'] ) );
}
# Get associated group
if($rs->fields['membership_directory_id'] > 0)
{
# get directory (group) id
$sql = "SELECT ab_id FROM {$p}import WHERE site_id = {$s} AND
ab_table = 'group' AND
plugin = '{$this->plugin}' AND
remote_id = '{$rs->fields['membership_directory_id']}'";
$cat = $db->Execute($sql);
$assoc_grant_group = serialize ( Array( $cat->fields['ab_id'] ) );
$assoc_grant_group_type = 1;
}
# Get a local id
$id = $db->GenID($p.'product_id');
# Insert the record
$sql = "INSERT INTO {$p}product SET
id = $id,
site_id = $s,
sku = 'DA-$id',
taxable = 0,
active = $status,
price_type = '$price_type',
price_base = '{$rs->fields['membership_price']}',
price_setup = '{$rs->fields['membership_setup']}',
price_group = ".$db->qstr( serialize(@$recur_price) ).",
price_recurr_default = '".@$price_recurr_default."',
price_recurr_type = '".@$price_recurr_type."',
price_recurr_weekday = '".@$price_recurr_weekday."',
price_recurr_week = '".@$price_recurr_week."',
price_recurr_schedule = '".@$price_recurr_schedule."',
price_recurr_cancel = 1,
price_trial_length_type = 0,
price_trial_length = 30,
price_trial_prod = '".@$price_trial_prod."',
assoc_grant_group = ".$db->qstr( @$assoc_grant_group ).",
assoc_grant_group_type = ".$db->qstr( @$assoc_grant_group_type ).",
avail_category_id = ".$db->qstr($categories);
$db->Execute($sql);
# Insert the import record
$this->import_transaction($this->plugin, $VAR['action'], 'product', $id, 'membership', $rs->fields['membership_id'], &$db);
### Insert the description:
$idx = $db->GenID($p.'product_translate_id');
$sql = "INSERT INTO {$p}product_translate SET
id = $idx,
site_id = $s,
product_id = $id,
language_id = '".DEFAULT_LANGUAGE."',
name = ".$db->qstr( $rs->fields['membership_name'] ).",
description_short = ".$db->qstr( $rs->fields['membership_desc'] ).",
description_full = ".$db->qstr( $rs->fields['membership_desc'] ) ;
$db->Execute($sql);
# Insert the import record
$this->import_transaction($this->plugin, $VAR['action'], 'product_translate', $idx, 'membership', $rs->fields['membership_id'], &$db);
# Complete the transaction
$db->CompleteTrans();
$rs->MoveNext();
}
$C_debug->alert($msg);
$offset = $VAR['offset'] + $this->select_limit;
echo "";
}
### Import all invoices from DreamAccount
function invoices()
{
global $VAR, $C_debug;
$p = AGILE_DB_PREFIX;
$s = DEFAULT_SITE;
### Connect to the remote Db;
$dbr = &NewADOConnection($this->type);
$dbr->Connect($this->host, $this->user, $this->pass, $this->db);
### Determine the offset for the account
if(empty($VAR['offset'])) $VAR['offset'] = 0;
@$offset = $VAR['offset'].",".$this->select_limit;
# select each account from Dreamaccount
$sql = "SELECT * FROM orders";
$rs = $dbr->SelectLimit($sql, $this->select_limit, $VAR['offset']);
if($rs === false) {
$C_debug->alert("Query to the table 'orders' failed!");
return false;
}
if($rs->RecordCount() == 0) {
$C_debug->alert("No more records to process!");
echo "";
return;
}
$msg = "Processing ".$rs->RecordCount()." Records...
";
# loop through each remote account
while(!$rs->EOF)
{
$msg.= "
Processing Order: {$rs->fields['order_id']}...";
# start a new transaction for the insert:
$db = &DB();
$db->StartTrans();
# Get a local id
$id = $db->GenID($p.'invoice_id');
# Get orig date
if(!empty($rs->fields['order_date'])) {
$date = explode('-', $rs->fields['order_date']);
$date_orig = mktime(0,0,0,$date[1], $date[2], $date[0]);
} else {
$date_orig = time();
}
### Get the default checkout plugin id:
$sql = "SELECT id FROM {$p}checkout WHERE
site_id = $s AND
checkout_plugin = '{$this->gateway}'";
$ch = $db->Execute($sql);
$checkout_plugin_id = $ch->fields['id'];
# get the process & billing status
if($rs->fields['order_status'] == 1)
{
$process_status = 1;
$billing_status = 1;
$billed_amt = $rs->fields['order_amount'];
}
else
{
$process_status = 0;
$billing_status = 0;
$billed_amt = 0;
}
# get the account id
$sql = "SELECT ab_id FROM {$p}import WHERE site_id = {$s} AND
ab_table = 'account' AND
plugin = '{$this->plugin}' AND
remote_id = '{$rs->fields['order_account_id']}'";
$account = $db->Execute($sql);
$account_id = $account->fields['ab_id'];
# get the billing id
$sql = "SELECT ab_id FROM {$p}import WHERE site_id = {$s} AND
ab_table = 'account_billing' AND
plugin = '{$this->plugin}' AND
remote_id = '{$rs->fields['order_billing_id']}'";
$billing = $db->Execute($sql);
$billing_id = $billing->fields['ab_id'];
# Insert the record
$sql = "INSERT INTO {$p}invoice SET
id = $id,
site_id = $s,
date_orig = ".$db->qstr($date_orig).",
date_last = ".$db->qstr(time()).",
process_status = ".$db->qstr(@$process_status).",
billing_status = ".$db->qstr(@$billing_status).",
account_id = ".$db->qstr(@$account_id).",
account_billing_id = ".$db->qstr(@$billing_id).",
checkout_plugin_id = ".$db->qstr(@$checkout_plugin_id).",
tax_amt = ".$db->qstr(@$rs->fields['tax_amount']).",
discount_amt = ".$db->qstr(@$rs->fields['credit_amount'] + $rs->fields['coupon_amount']).",
total_amt = ".$db->qstr(@$rs->fields['order_amount']).",
billed_amt = ".$db->qstr(@$billed_amt).",
billed_currency_id = ".$db->qstr(DEFAULT_CURRENCY).",
actual_billed_amt = ".$db->qstr(@$billed_amt).",
actual_billed_currency_id = ".$db->qstr(DEFAULT_CURRENCY).",
notice_count = 0,
notice_max = 1,
notice_next_date = ".$db->qstr(time()).",
grace_period = 7,
due_date = ".$db->qstr(time());
$db->Execute($sql);
# Insert the import record
$this->import_transaction($this->plugin, $VAR['action'], 'invoice', $id, 'invoices', $rs->fields['order_id'], &$db);
# Complete the transaction
$db->CompleteTrans();
$rs->MoveNext();
}
$C_debug->alert($msg);
$offset = $VAR['offset'] + $this->select_limit;
echo "";
}
## Import DA subscriptions & line items
function services()
{
global $VAR, $C_debug;
$p = AGILE_DB_PREFIX;
$s = DEFAULT_SITE;
### Connect to the remote Db;
$dbr = &NewADOConnection($this->type);
$dbr->Connect($this->host, $this->user, $this->pass, $this->db);
### Determine the offset for the account
if(empty($VAR['offset'])) $VAR['offset'] = 0;
@$offset = $VAR['offset'].",".$this->select_limit;
# select each account from Dreamaccount
$sql = "SELECT * FROM domains";
$rs = $dbr->SelectLimit($sql, $this->select_limit, $VAR['offset']);
if($rs === false) {
$C_debug->alert("Query to the table 'domains' failed!");
return false;
}
if($rs->RecordCount() == 0) {
$C_debug->alert("No more records to process!");
echo "";
return;
}
$msg = "Processing ".$rs->RecordCount()." Records...
";
# loop through each remote account
while(!$rs->EOF)
{
$msg.= "
Processing Subscription: {$rs->fields['domain_id']}...";
# start a new transaction for the insert:
$db = &DB();
$db->StartTrans();
# Get a local id
$id = $db->GenID($p.'service_id');
# Get orig date
if(!empty($rs->fields['domain_start_date'])) {
$date = explode('-', $rs->fields['domain_start_date']);
$date_orig = mktime(0,0,0,$date[1], $date[2], $date[0]);
} else {
$date_orig = time();
}
# Get last billed date date
if(!empty($rs->fields['domain_host_last_billed'])) {
$date = explode('-', $rs->fields['domain_host_last_billed']);
$date_last = mktime(0,0,0,$date[1], $date[2], $date[0]);
} else {
$date_last = $date_orig;
}
### Get the default checkout plugin id:
$sql = "SELECT id FROM {$p}checkout WHERE
site_id = $s AND
checkout_plugin = '{$this->gateway}'";
$ch = $db->Execute($sql);
$checkout_plugin_id = $ch->fields['id'];
# get the account id
$sql = "SELECT ab_id FROM {$p}import WHERE site_id = {$s} AND
ab_table = 'account' AND
plugin = '{$this->plugin}' AND
remote_id = '{$rs->fields['domain_account_id']}'";
$account = $db->Execute($sql);
$account_id = $account->fields['ab_id'];
# get the billing id
$sql = "SELECT ab_id FROM {$p}import WHERE site_id = {$s} AND
ab_table = 'account_billing' AND
plugin = '{$this->plugin}' AND
remote_id = '{$rs->fields['domain_billing_id']}'";
$billing = $db->Execute($sql);
$billing_id = $billing->fields['ab_id'];
# get the invoice id
$sql = "SELECT ab_id FROM {$p}import WHERE site_id = {$s} AND
ab_table = 'invoice' AND
plugin = '{$this->plugin}' AND
remote_id = '{$rs->fields['domain_order_id']}'";
$invoice = $db->Execute($sql);
$invoice_id = $invoice->fields['ab_id'];
# get the product id
$sql = "SELECT ab_id FROM {$p}import WHERE site_id = {$s} AND
ab_table = 'product' AND
plugin = '{$this->plugin}' AND
remote_id = '{$rs->fields['domain_host_id']}'";
$product = $db->Execute($sql);
$product_id = $product->fields['ab_id'];
# Get the product details
$sql = "SELECT * FROM {$p}product WHERE site_id = {$s} AND id = {$product_id}";
$product = $db->Execute($sql);
# Status
if($rs->fields['domain_host_status'] == 1) {
$active = 1;
$suspend = 0;
} else {
$active = 0;
$suspend = 1;
}
# Calculate next bill date:
include_once(PATH_MODULES . 'service/service.inc.php');
$service = new service;
$date_next = $service->calcNextInvoiceDate( $date_last,
$product->fields['price_recurr_default'],
$product->fields['price_recurr_type'],
$product->fields['price_recurr_weekday'],
$product->fields['price_recurr_week'] );
# Insert the record
$sql = "INSERT INTO {$p}service SET
id = $id,
site_id = $s,
queue = 'active',
date_orig = ".$db->qstr($date_orig).",
date_last = ".$db->qstr(time()).",
invoice_id = ".$db->qstr(@$invoice_id).",
account_id = ".$db->qstr(@$account_id).",
account_billing_id = ".$db->qstr(@$billing_id).",
product_id = ".$db->qstr(@$product_id).",
sku = ".$db->qstr($product->fields['sku']).",
type = ".$db->qstr('group').",
active = ".$db->qstr($active).",
suspend_billing = ".$db->qstr($suspend).",
date_last_invoice = ".$db->qstr($date_last).",
date_next_invoice = ".$db->qstr($date_next).",
price = ".$db->qstr($product->fields['price_base']).",
price_type = ".$db->qstr($product->fields['price_type']).",
taxable = ".$db->qstr($product->fields['taxable']).",
recur_type = ".$db->qstr($product->fields['price_recurr_type']).",
recur_schedule = ".$db->qstr($product->fields['price_recurr_schedule']).",
recur_weekday = ".$db->qstr($product->fields['price_recurr_weekday']).",
recur_week = ".$db->qstr($product->fields['price_recurr_week']).",
recur_cancel = ".$db->qstr($product->fields['price_recurr_cancel']).",
group_grant = ".$db->qstr($product->fields['assoc_grant_group']).",
group_type = ".$db->qstr($product->fields['assoc_grant_group_type']);
$db->Execute($sql);
# Insert the import record
$this->import_transaction($this->plugin, $VAR['action'], 'service', $id, 'services', $rs->fields['domain_id'], &$db);
# Insert the invoice item:
$idx = $db->GenID($p.'invoice_item_id');
$sql = "INSERT INTO {$p}invoice_item SET
id = $id,
site_id = $s,
invoice_id = ".$db->qstr(@$invoice_id).",
product_id = ".$db->qstr(@$product_id).",
date_orig = ".$db->qstr($date_orig).",
sku = ".$db->qstr($product->fields['sku']).",
quantity = 1,
item_type = 0,
price_type = ".$db->qstr($product->fields['price_recurr_type']).",
price_base = ".$db->qstr($product->fields['price_base']).",
price_setup = ".$db->qstr($product->fields['price_setup']).",
recurring_schedule = ".$db->qstr($product->fields['price_recurr_schedule']);
$db->Execute($sql);
# Insert the import record
$this->import_transaction($this->plugin, $VAR['action'], 'invoice_item', $id, 'services', $rs->fields['domain_id'], &$db);
# Complete the transaction
$db->CompleteTrans();
$rs->MoveNext();
}
$C_debug->alert($msg);
$offset = $VAR['offset'] + $this->select_limit;
echo "";
}
# Import any notes
function notes()
{
global $VAR, $C_debug;
$p = AGILE_DB_PREFIX;
$s = DEFAULT_SITE;
### Connect to the remote Db;
$dbr = &NewADOConnection($this->type);
$dbr->Connect($this->host, $this->user, $this->pass, $this->db);
### Determine the offset for the account
if(empty($VAR['offset'])) $VAR['offset'] = 0;
@$offset = $VAR['offset'].",".$this->select_limit;
# select each hosting server
$sql = "SELECT * FROM notes";
$rs = $dbr->SelectLimit($sql, $this->select_limit, $VAR['offset']);
if($rs === false) {
$C_debug->alert("Query to the table 'notes' failed!");
return false;
}
if($rs->RecordCount() == 0) {
$C_debug->alert("No more records to process!");
echo "";
return;
}
$msg = "Processing ".$rs->RecordCount()." Records...
";
# loop through each hosting server
while(!$rs->EOF)
{
unset($recur_price);
$msg.= "
Processing Note ID: {$rs->fields['note_id']}...";
# start a new transaction for the insert:
$db = &DB();
$db->StartTrans();
if(!empty($rs->fields['note_account_id']))
{
### ACCOUNT MEMO
# get the account id
$sql = "SELECT ab_id FROM {$p}import WHERE site_id = {$s} AND
ab_table = 'account' AND
plugin = '{$this->plugin}' AND
remote_id = '{$rs->fields['note_account_id']}'";
$account = $db->Execute($sql);
$account_id = $account->fields['ab_id'];
# Create the server record in AB now:
$id = $db->GenID($p.'host_server_id');
$sql = "INSERT INTO {$p}account_memo SET
id = {$id},
site_id = {$s},
date_orig = ".time().",
staff_id = 1,
account_id = {$account_id},
type = 'admin',
memo = ".$db->qstr( $rs->fields['note_message'] );
$db->Execute($sql);
# Insert the import record
$this->import_transaction($this->plugin, $VAR['action'], 'account_memo', $id, 'notes', $rs->fields['note_id'], &$db);
}
elseif(!empty( $rs->fields['note_order_id'] ))
{
### Invoice Memo
# get the invoice id
$sql = "SELECT ab_id FROM {$p}import WHERE site_id = {$s} AND
ab_table = 'invoice' AND
plugin = '{$this->plugin}' AND
remote_id = '{$rs->fields['note_order_id']}'";
$invoice = $db->Execute($sql);
$invoice_id = $invoice->fields['ab_id'];
# Create the server record in AB now:
$id = $db->GenID($p.'invoice_memo_id');
$sql = "INSERT INTO {$p}invoice_memo SET
id = {$id},
site_id = {$s},
date_orig = ".time().",
account_id = 1,
invoice_id = {$invoice_id},
type = '',
memo = ".$db->qstr( $rs->fields['note_message'] );
$db->Execute($sql);
# Insert the import record
$this->import_transaction($this->plugin, $VAR['action'], 'invoice_memo', $id, 'notes', $rs->fields['note_id'], &$db);
}
elseif(!empty( $rs->fields['note_domain_id'] ))
{
### Service Memo
# get the service id
$sql = "SELECT ab_id FROM {$p}import WHERE site_id = {$s} AND
ab_table = 'service' AND
plugin = '{$this->plugin}' AND
remote_id = '{$rs->fields['note_domain_id']}'";
$service = $db->Execute($sql);
$service_id = $invoice->fields['ab_id'];
# Create the server record in AB now:
$id = $db->GenID($p.'service_memo_id');
$sql = "INSERT INTO {$p}service_memo SET
id = {$id},
site_id = {$s},
date_orig = ".time().",
staff_id = 1,
service_id = {$service_id},
type = 'admin',
memo = ".$db->qstr( $rs->fields['note_message'] );
$db->Execute($sql);
# Insert the import record
$this->import_transaction($this->plugin, $VAR['action'], 'service_memo_id', $id, 'notes', $rs->fields['note_id'], &$db);
}
# Complete the transaction
$db->CompleteTrans();
$rs->MoveNext();
}
$C_debug->alert($msg);
$offset = $VAR['offset'] + $this->select_limit;
echo "";
}
// decryption function for old DA credit cards
function RC4($data, $case) {
include($this->salt);
if ($case == 'de') {
$data = urldecode($data);
}
$key[] = "";
$box[] = "";
$temp_swap = "";
$pwd_length = 0;
$pwd_length = strlen($pwd);
for ($i = 0; $i <= 255; $i++) {
$key[$i] = ord(substr($pwd, ($i % $pwd_length), 1));
$box[$i] = $i;
}
$x = 0;
for ($i = 0; $i <= 255; $i++) {
$x = ($x + $box[$i] + $key[$i]) % 256;
$temp_swap = $box[$i];
$box[$i] = $box[$x];
$box[$x] = $temp_swap;
}
$temp = "";
$k = "";
$cipherby = "";
$cipher = "";
$a = 0;
$j = 0;
for ($i = 0; $i < strlen($data); $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$temp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $temp;
$k = $box[(($box[$a] + $box[$j]) % 256)];
$cipherby = ord(substr($data, $i, 1)) ^ $k;
$cipher .= chr($cipherby);
}
if ($case == 'de') {
$cipher = urldecode(urlencode($cipher));
} else {
$cipher = urlencode($cipher);
}
return $cipher;
}
// DETERMINE CREDIT CARD TYPE
function cc_identify($cc_no) {
$cc_no = ereg_replace ('[^0-9]+', '', $cc_no);
// Get card type based on prefix and length of card number
if (ereg ('^4(.{12}|.{15})$', $cc_no)) {
return 'visa';
} elseif (ereg ('^5[1-5].{14}$', $cc_no)) {
return 'mc';
} elseif (ereg ('^3[47].{13}$', $cc_no)) {
return 'amex';
} elseif (ereg ('^3(0[0-5].{11}|[68].{12})$', $cc_no)) {
return 'diners';
} elseif (ereg ('^6011.{12}$', $cc_no)) {
return 'discover';
} elseif (ereg ('^(3.{15}|(2131|1800).{11})$', $cc_no)) {
return 'jcb';
} elseif (ereg ('^2(014|149).{11})$', $cc_no)) {
return 'enrout';
} else {
return "";
}
}
}
?>