This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
khosb/plugins/import/WHMCS.php

1104 lines
34 KiB
PHP
Raw Normal View History

2009-08-03 04:10:16 +00:00
<?php
/*
* osBilling - Open Billing Software
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Originally authored by Deon George
*
* @author Deon George <deonATleenooksDOTnet>
* @copyright 2009 Deon George
* @link http://osb.leenooks.net
* @license http://www.gnu.org/licenses/
* @package AgileBill
* @subpackage Import
*/
DEFINE('WHMCS_DIR','/var/www/whmcs/');
include_once WHMCS_DIR.'includes/functions.php';
/**
* WHMCS import module
*
* @package AgileBill
* @subpackage Import
*/
class import_plugin extends import {
private $encryption_key;
public function __construct() {
# 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 = 'WHMCS';
$this->plugin = 'WHMCS';
$this->select_limit = 50;
$this->instructions = '
<b>Preliminary Instructions:</b><br/><br/>
<ol>
<li>Open '. __FILE__ .' and edit the database settings, and the location to your WHMCS_DIR...</li>
<li>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.</li>
<li>Make sure you have your TLD configurations set, before importing domains.</li>
<li>HINT: Before importing products, ensure that you have configured your map file, this will set the SKU, and will save you changing this data if you need to undo and re-import.</li>
</ol>';
array_push($this->actions,array(
'name' => 'test',
'desc' => '<b>Step 1:</b> Test the database connection',
'depn' => false
));
array_push($this->actions,array(
'name' => 'product_cat',
'desc' => '<b>Step 2:</b> Import the Product Categories',
'depn' => array('test')
));
array_push($this->actions,array(
'name' => 'products',
'desc' => '<b>Step 3:</b> Import the Products',
'depn' => array('test','product_cat')
));
array_push($this->actions,array(
'name' => 'accounts',
'desc' => '<b>Step 4:</b> Import the Accounts',
'depn' => array('test')
));
array_push($this->actions,array(
'name' => 'pre_services',
'desc' => '<b>Step 5:</b> Edit the Products (update the SKU details if necessary) then click Ready',
'depn' => array('products')
));
array_push($this->actions,array(
'name' => 'services',
'desc' => '<b>Step 6:</b> Import the Services',
'depn' => array('pre_services','accounts')
));
array_push($this->actions,array(
'name' => 'pre_tld',
'desc' => '<b>Step 7:</b> Set up your TLD then click Ready',
'depn' => array('test')
));
array_push($this->actions,array(
'name' => 'domains',
'desc' => '<b>Step 8:</b> Import the Domains',
'depn' => array('pre_tld','accounts')
));
array_push($this->actions,array(
'name' => 'invoices',
'desc' => '<b>Step 9:</b> Import the Invoices',
'depn' => array('services','accounts')
));
array_push($this->actions,array(
'name' => 'invoice_items',
'desc' => '<b>Step 10:</b> Import the Invoices Items',
'depn' => array('invoices')
));
}
protected function pre_services() {
$this->pre_test();
}
protected function pre_tld() {
$this->pre_test();
}
/**
* Product Categories
*/
protected function product_cat() {
global $VAR,$C_debug;
# 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 = sprintf('%s,%s',$VAR['offset'],$this->select_limit);
$remote_table = 'tblproductgroups';
$ab_table = 'product_cat';
# Select
$sql = sprintf('SELECT * FROM %s',$remote_table);
$rs = $dbr->SelectLimit($sql,$this->select_limit,$offset);
if ($rs === false) {
$C_debug->alert(sprintf('Query to the table "%s" failed!',$remote_table));
return false;
}
if ($rs->RecordCount() == 0) {
$C_debug->alert('No more records to process!');
printf("<script type='text/javascript' language=javascript>setTimeout('document.location=\'?_page=import:import&plugin=%s\'',1500);</script>",$VAR['plugin']);
return;
}
$msg = sprintf('Processing %s Records...<br/>',$rs->RecordCount());
$map = array();
$map['name'] = 'name';
$map['position'] = 'order';
# Loop through each remote item
while (! $rs->EOF) {
$msg .= sprintf('<br/>Processing : %s...',$rs->fields['name']);
# Start a new transaction for the insert:
$db = &DB();
$db->StartTrans();
$update = array();
foreach ($map as $a => $b)
$update[$a] = $rs->fields[$b];
$update['parent_id'] = 0;
$update['group_avail'] = serialize(array('0'=>'0'));
$update['template'] = 'Paged Listing';
$update['notes'] = 'Imported from WHMCS';
$update['thumbnail'] = '';
$update['image'] = '';
$update['max'] = '10';
if ($rs->fields['hidden'] == 'on')
$update['status'] = 0;
else
$update['status'] = 1;
# Import the item
$db->Execute(sqlInsert($db,$ab_table,$update));
$id = $db->Execute(sqlSelect($db,$ab_table,'id',$update,'','0,1'));
# Insert the import record
$this->import_transaction($this->plugin,$VAR['action'],$ab_table,$id->fields['id'],$remote_table,$rs->fields['id'],$db);
# Complete the transaction
$db->CompleteTrans();
$rs->MoveNext();
}
$C_debug->alert($msg);
printf("<script type='text/javascript' language=javascript>setTimeout('document.location=\'?_page=core:blank&offset=%s&action=%s&plugin=%s&do[]=import:do_action\'', 1200);</script>",
$VAR['offset']+$this->select_limit,$VAR['action'],$VAR['plugin']);
}
/**
* Products
*/
protected function products() {
global $VAR,$C_debug;
# 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 = sprintf('%s,%s',$VAR['offset'],$this->select_limit);
$remote_table = 'tblproducts';
$ab_table = 'product';
# Select
$sql = sprintf('SELECT * FROM %s',$remote_table);
$rs = $dbr->SelectLimit($sql,$this->select_limit,$offset);
if ($rs === false) {
$C_debug->alert(sprintf('Query to the table "%s" failed!',$remote_table));
return false;
}
if ($rs->RecordCount() == 0) {
$C_debug->alert('No more records to process!');
printf("<script type='text/javascript' language=javascript>setTimeout('document.location=\'?_page=import:import&plugin=%s\'',1500);</script>",$VAR['plugin']);
return;
}
# Load Categories Imported
$db = &DB();
$imprs = $db->Execute(sqlSelect($db,'import','ab_id,remote_id',sprintf('plugin=::%s:: AND action=::%s::',$this->plugin,'product_cat')));
while (! $imprs->EOF) {
$cat[$imprs->fields['remote_id']] = $imprs->fields['ab_id'];
$imprs->MoveNext();
}
$msg = sprintf('Processing %s Records...<br/>',$rs->RecordCount());
# If there is a map file, open it
$pmap = $this->read_map();
# Table mapping
$map = array();
$map['price_setup'] = 'msetupfee';
$map['price_base'] = 'monthly';
# Loop through each remote item
while (! $rs->EOF) {
$msg .= sprintf('<br/>Processing : %s...',$rs->fields['name']);
# Start a new transaction for the insert:
$db = &DB();
$db->StartTrans();
$update = array();
foreach ($map as $a => $b)
$update[$a] = $rs->fields[$b];
$update['date_last'] = time();
$update['sku'] = sprintf('IMPORT-%s',$rs->fields['id']);
$update['taxable'] = 1;
$update['group_avail'] = serialize(array('0'=>'0'));
$update['avail_category_id'] = serialize(array('0'=>$cat[$rs->fields['gid']]));
$update['price_type'] = 1;
$update['price_recurr_default'] = 1;
$update['price_recurr_weekday'] = 1;
$update['price_recurr_week'] = 1;
$update['price_recurr_schedule'] = 0;
$update['price_recurr_type'] = 1;
if ($rs->fields['hidden'] == 'on')
$update['active'] = 0;
else
$update['active'] = 1;
# Pricing
$pricing = array();
# * Weekly
$pricing[0]['show'] = '0';
$pricing[0][0]['price_base'] = '0';
$pricing[0][0]['price_setup'] = '0';
# * Monthly
$pricing[1]['show'] = $rs->fields['monthly'] > 0 ? '1' : '0';
$pricing[1][0]['price_base'] = $rs->fields['monthly'];
$pricing[1][0]['price_setup'] = $rs->fields['msetupfee'];
# * Quarterly
$pricing[2]['show'] = $rs->fields['quarterly'] > 0 ? '1' : '0';
$pricing[2][0]['price_base'] = $rs->fields['quarterly'];
$pricing[2][0]['price_setup'] = $rs->fields['qsetupfee'];
# * 6 Months
$pricing[3]['show'] = $rs->fields['semiannual'] > 0 ? '1' : '0';
$pricing[3][0]['price_base'] = $rs->fields['semiannual'];
$pricing[3][0]['price_setup'] = $rs->fields['ssetupfee'];
# * 12 Months
$pricing[4]['show'] = $rs->fields['annual'] > 0 ? '1' : '0';
$pricing[4][0]['price_base'] = $rs->fields['annual'];
$pricing[4][0]['price_setup'] = $rs->fields['asetupfee'];
# * 24 Months
$pricing[5]['show'] = $rs->fields['biennial'] > 0 ? '1' : '0';
$pricing[5][0]['price_base'] = $rs->fields['biennial'];
$pricing[5][0]['price_setup'] = $rs->fields['bsetupfee'];
# * 36 Months
$pricing[6]['show'] = '0';
$pricing[6][0]['price_base'] = '0';
$pricing[6][0]['price_setup'] = '0';
$update['price_group'] = serialize($pricing);
# Get the fixed items in the map table.
if (isset($pmap[$ab_table][$rs->fields['id']*1]))
foreach ($pmap[$ab_table][$rs->fields['id']*1] as $field => $value)
$update[$field] = $value;
# Import the item
$db->Execute(sqlInsert($db,$ab_table,$update));
$id = $db->Execute(sqlSelect($db,$ab_table,'id',$update,'','0,1'));
# Insert the import record
$this->import_transaction($this->plugin,$VAR['action'],$ab_table,$id->fields['id'],$remote_table,$rs->fields['id'],$db);
# Add translations
$submap = array();
$submap['name'] = 'name';
$submap['description_short'] = 'name';
$submap['description_full'] = 'description';
$update = array();
foreach ($submap as $a => $b)
$update[$a] = $rs->fields[$b];
$update['language_id'] = DEFAULT_LANGUAGE;
$update['product_id'] = $id->fields['id'];
# @todo For some reason sqlInsert() generates an error, so we need to produce the SQL and run it normally
$update['site_id'] = DEFAULT_SITE;
# @todo It seems translations are referenced by 'id', rather than 'product_id'
$update['id'] = $id->fields['id'];
$sql = sprintf("INSERT INTO %s (%s) VALUES ('%s')",AGILE_DB_PREFIX.'product_translate',implode(',',array_keys($update)),implode("','",$update));
$pdrs = $db->Execute($sql);
if (! $pdrs && $db->_errorMsg) {
printf("<pre>* %s\n%s</pre>",$db->_errorMsg,$sql);
}
$this->import_transaction($this->plugin,$VAR['action'],'product_translate',$update['id'],'',$rs->fields['id'],$db);
# Complete the transaction
$db->CompleteTrans();
$rs->MoveNext();
}
$C_debug->alert($msg);
printf("<script type='text/javascript' language=javascript>setTimeout('document.location=\'?_page=core:blank&offset=%s&action=%s&plugin=%s&do[]=import:do_action\'', 1200);</script>",
$VAR['offset']+$this->select_limit,$VAR['action'],$VAR['plugin']);
}
/**
* Accounts
*/
protected function accounts() {
global $VAR,$C_debug;
# Files to your WHMCS installation (required to decrypt encrypted fields)
include_once WHMCS_DIR.'dbconnect.php';
# 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 = sprintf('%s,%s',$VAR['offset'],$this->select_limit);
$remote_table = 'tblclients';
$ab_table = 'account';
# Select
$sql = sprintf('SELECT * FROM %s',$remote_table);
$rs = $dbr->SelectLimit($sql,$this->select_limit,$offset);
if ($rs === false) {
$C_debug->alert(sprintf('Query to the table "%s" failed!',$remote_table));
return false;
}
if ($rs->RecordCount() == 0) {
$C_debug->alert('No more records to process!');
printf("<script type='text/javascript' language=javascript>setTimeout('document.location=\'?_page=import:import&plugin=%s\'',1500);</script>",$VAR['plugin']);
return;
}
$msg = sprintf('Processing %s Records...<br/>',$rs->RecordCount());
$map = array();
$map['username'] = 'email';
#$map['email'] = 'email';
$map['first_name'] = 'firstname';
$map['last_name'] = 'lastname';
$map['company'] = 'companyname';
$map['address1'] = 'address1';
$map['address2'] = 'address2';
$map['city'] = 'city';
$map['state'] = 'state';
$map['zip'] = 'postcode';
# Loop through each remote item
while (! $rs->EOF) {
$msg .= sprintf('<br/>Processing : %s...',$rs->fields['email']);
# Start a new transaction for the insert:
$db = &DB();
$db->StartTrans();
$update = array();
foreach ($map as $a => $b)
$update[$a] = $rs->fields[$b];
$update['date_last'] = time();
$update['language_id'] = DEFAULT_LANGUAGE;
# @todo Work out currency based on country address
$update['country_id'] = '36';
$update['currency_id'] = '6';
$update['theme_id'] = DEFAULT_THEME;
$update['email_type'] = '1';
$update['invoice_delivery'] = '1';
$update['invoice_show_itemized'] = '1';
$update['invoice_grace'] = '0';
$update['invoice_advance_gen'] = '0';
if ($rs->fields['status'] == 'Active')
$update['status'] = 1;
else
$update['status'] = 0;
$update['password'] = md5(decrypt($rs->fields['password'],$encryption_key));
# Import the item
$db->Execute(sqlInsert($db,$ab_table,$update));
$id = $db->Execute(sqlSelect($db,$ab_table,'id',$update,'','0,1'));
# Insert the import record
$this->import_transaction($this->plugin,$VAR['action'],$ab_table,$id->fields['id'],$remote_table,$rs->fields['id'],$db);
# Complete the transaction
$db->CompleteTrans();
$rs->MoveNext();
}
$C_debug->alert($msg);
printf("<script type='text/javascript' language=javascript>setTimeout('document.location=\'?_page=core:blank&offset=%s&action=%s&plugin=%s&do[]=import:do_action\'', 1200);</script>",
$VAR['offset']+$this->select_limit,$VAR['action'],$VAR['plugin']);
}
/**
* Services
*/
protected function services() {
global $VAR,$C_debug;
# Files to your WHMCS installation (required to decrypt encrypted fields)
include_once WHMCS_DIR.'dbconnect.php';
# 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 = sprintf('%s,%s',$VAR['offset'],$this->select_limit);
$remote_table = 'tblhosting';
$ab_table = 'service';
# Select
$sql = '
SELECT tblhosting.id as id, userid, packageid, domainstatus, domain, amount, regdate, lastupdate, billingcycle, username, password, nextinvoicedate, tblproducts.name as product
FROM tblhosting,tblproducts where tblhosting.packageid=tblproducts.id';
$rs = $dbr->SelectLimit($sql,$this->select_limit,$offset);
if ($rs === false) {
$C_debug->alert(sprintf('Query to the table "%s" failed!',$remote_table));
return false;
}
if ($rs->RecordCount() == 0) {
$C_debug->alert('No more records to process!');
printf("<script type='text/javascript' language=javascript>setTimeout('document.location=\'?_page=import:import&plugin=%s\'',1500);</script>",$VAR['plugin']);
return;
}
$db = &DB();
# Load Products Imported
$imprs = $db->Execute(sqlSelect($db,'import','ab_id,remote_id',sprintf('plugin=::%s:: AND action=::%s:: AND remote_table=::%s::',$this->plugin,'products','tblproducts')));
while (! $imprs->EOF) {
$prod[$imprs->fields['remote_id']] = $imprs->fields['ab_id'];
$imprs->MoveNext();
}
# Load Accounts Imported
$imprs = $db->Execute(sqlSelect($db,'import','ab_id,remote_id',sprintf('plugin=::%s:: AND action=::%s:: AND remote_table=::%s::',$this->plugin,'accounts','tblclients')));
while (! $imprs->EOF) {
$account[$imprs->fields['remote_id']] = $imprs->fields['ab_id'];
$imprs->MoveNext();
}
$msg = sprintf('Processing %s Records...<br/>',$rs->RecordCount());
$map = array();
# @todo This amount includes tax, and needs to exclude it.
$map['price'] = 'amount';
# Loop through each remote item
while (! $rs->EOF) {
$msg .= sprintf('<br/>Processing : %s...',$rs->fields['id']);
# Start a new transaction for the insert:
$db = &DB();
$db->StartTrans();
$update = array();
foreach ($map as $a => $b)
$update[$a] = $rs->fields[$b];
# @todo This amount includes tax, and needs to work out tax.
$update['price'] = sprintf('%3.2f',$update['price']/11*10);
if (preg_match('/^ADSL/',$rs->fields['product'])) {
$update['prod_plugin_name'] = 'ADSL';
$update['type'] = 'product';
$sql = sprintf("SELECT fieldname,value FROM tblcustomfieldsvalues,tblcustomfields WHERE tblcustomfieldsvalues.fieldid=tblcustomfields.id AND tblcustomfieldsvalues.relid=%s AND tblcustomfields.relid=%s AND type='product'",$rs->fields['id'],$rs->fields['packageid']);
$plugin = array();
$update['prod_attr'] = '';
# Connect to the remote DB
$dbr = NewADOConnection($this->type);
$dbr->Connect($this->host,$this->user,$this->pass,$this->db);
$adsl = $dbr->Execute($sql);
if ($adsl && $adsl->RecordCount()) {
while (! $adsl->EOF) {
if (trim($adsl->fields['value'])) {
$plugin[$adsl->fields['fieldname']] = $adsl->fields['value'];
$update['prod_attr'] .= sprintf("%s==%s\r\n",$adsl->fields['fieldname'],$adsl->fields['value']);
$update['host_username'] = $rs->fields['username'];
$update['host_password'] = decrypt($rs->fields['password'],$encryption_key);
}
$adsl->MoveNext();
}
$update['prod_plugin_data'] = serialize($plugin);
}
} elseif ($rs->fields['domain']) {
$update['type'] = 'host';
$update['domain_name'] = $rs->fields['domain'];
$update['host_username'] = $rs->fields['username'];
$update['host_password'] = decrypt($rs->fields['password'],$encryption_key);
}
# Strip the leading zeros
$rs->fields['packageid'] *= 1;
$rs->fields['userid'] *= 1;
$update['product_id'] = $prod[$rs->fields['packageid']];
$update['account_id'] = $account[$rs->fields['userid']];
$db = &DB();
$sku = $db->Execute(sqlSelect($db,'product','sku',sprintf('id=%s',$update['product_id']),'','0,1'));
$update['sku'] = $sku->fields['sku'];
if ($rs->fields['domainstatus'] == 'Active')
$update['active'] = 1;
else
$update['active'] = 0;
$update['taxable'] = 1;
$update['recur_schedule_change'] = 0;
$update['suspend_billing'] = 0;
$update['recur_cancel'] = 0;
$update['recur_modify'] = 0;
switch ($rs->fields['billingcycle']) {
case 'Annually':
$update['recur_schedule'] = 4; //monthly
$update['recur_type'] = 0;
break;
case 'Monthly':
$update['recur_schedule'] = 1; //monthly
$update['recur_type'] = 1;
$update['recur_type'] = 1;
$update['recur_weekday'] = 1;
break;
case 'Quarterly':
$update['recur_schedule'] = 2; //quarterly
$update['recur_type'] = 1;
$update['recur_weekday'] = 1;
break;
case 'Biennially':
$update['recur_schedule'] = 5; //two-years
$update['recur_type'] = 0;
break;
default:
$update['recur_schedule'] = 0; //free?
$update['recur_type'] = 0;
};
$update['date_next_invoice'] = strtotime($rs->fields['nextinvoicedate']);
$update['date_orig'] = strtotime($rs->fields['regdate']);
$update['date_last'] = strtotime($rs->fields['lastupdate']);
# Import the item
$db->Execute(sqlInsert($db,$ab_table,$update));
$id = $db->Execute(sqlSelect($db,$ab_table,'id',$update,'','0,1'));
# Insert the import record
$this->import_transaction($this->plugin,$VAR['action'],$ab_table,$id->fields['id'],$remote_table,$rs->fields['id'],$db);
# Complete the transaction
$db->CompleteTrans();
$rs->MoveNext();
}
$C_debug->alert($msg);
printf("<script type='text/javascript' language=javascript>setTimeout('document.location=\'?_page=core:blank&offset=%s&action=%s&plugin=%s&do[]=import:do_action\'', 1200);</script>",
$VAR['offset']+$this->select_limit,$VAR['action'],$VAR['plugin']);
}
/**
* Domains
*/
protected function domains() {
global $VAR,$C_debug;
# Files to your WHMCS installation (required to decrypt encrypted fields)
include_once WHMCS_DIR.'dbconnect.php';
# 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 = sprintf('%s,%s',$VAR['offset'],$this->select_limit);
$remote_table = 'tbldomains';
$ab_table = 'service';
# Select
$sql = sprintf('SELECT * FROM %s',$remote_table);
$rs = $dbr->SelectLimit($sql,$this->select_limit,$offset);
if ($rs === false) {
$C_debug->alert(sprintf('Query to the table "%s" failed!',$remote_table));
return false;
}
if ($rs->RecordCount() == 0) {
$C_debug->alert('No more records to process!');
printf("<script type='text/javascript' language=javascript>setTimeout('document.location=\'?_page=import:import&plugin=%s\'',1500);</script>",$VAR['plugin']);
return;
}
$db = &DB();
# Load Accounts Imported
$imprs = $db->Execute(sqlSelect($db,'import','ab_id,remote_id',sprintf('plugin=::%s:: AND action=::%s:: AND remote_table=::%s::',$this->plugin,'accounts','tblclients')));
while (! $imprs->EOF) {
$account[$imprs->fields['remote_id']] = $imprs->fields['ab_id'];
$imprs->MoveNext();
}
$msg = sprintf('Processing %s Records...<br/>',$rs->RecordCount());
$map = array();
$map['domain_term'] = 'registrationperiod';
# Loop through each remote item
while (! $rs->EOF) {
$msg .= sprintf('<br/>Processing : %s...',$rs->fields['domain']);
# Start a new transaction for the insert:
$db = &DB();
$db->StartTrans();
$update = array();
foreach ($map as $a => $b)
$update[$a] = $rs->fields[$b];
# @todo Determine price from register details
$update['price'] = 45*$update['domain_term'];
$update['type'] = 'domain';
$update['sku'] = 'DOMAIN-RENEW';
# Strip the leading zeros
$rs->fields['userid'] *= 1;
$update['account_id'] = $account[$rs->fields['userid']];
if ($rs->fields['status'] == 'Active')
$update['active'] = 1;
else
$update['active'] = 0;
$update['price_type'] = 0;
$update['taxable'] = 1;
$update['domain_date_expire'] = strtotime($rs->fields['expirydate']);
switch ($rs->fields['type']) {
case 'Register':
default:
$update['domain_type'] = 'register';
break;
}
$update['date_next_invoice'] = strtotime($rs->fields['nextinvoicedate']);
$update['date_orig'] = strtotime($rs->fields['registrationdate']);
$update['date_last'] = time();
# Work out TLD and REGISTER PLUGIN
$arr = explode('.',strtolower($rs->fields['domain']));
$update['domain_tld'] = '';
$update['domain_name'] = $arr[0];
for ($i=1; $i<count($arr); $i++)
$update['domain_tld'] .= sprintf('.%s',$arr[$i]);
# Chop off the initial .
$update['domain_tld'] = preg_replace('/^\./','',$update['domain_tld']);
# Determine the tld_id
$tldrs = $db->Execute(sqlSelect($db,'host_tld','id,registrar_plugin_id',sprintf('name=::%s::',$update['domain_tld'])));
$update['domain_host_tld_id'] = $tldrs->fields['id'];
$update['domain_host_registrar_id'] = $tldrs->fields['registrar_plugin_id'];
# Import the item
$db->Execute(sqlInsert($db,$ab_table,$update));
$id = $db->Execute(sqlSelect($db,$ab_table,'id',$update,'','0,1'));
# Insert the import record
$this->import_transaction($this->plugin,$VAR['action'],$ab_table,$id->fields['id'],$remote_table,$rs->fields['id'],$db);
# Complete the transaction
$db->CompleteTrans();
$rs->MoveNext();
}
$C_debug->alert($msg);
printf("<script type='text/javascript' language=javascript>setTimeout('document.location=\'?_page=core:blank&offset=%s&action=%s&plugin=%s&do[]=import:do_action\'', 1200);</script>",
$VAR['offset']+$this->select_limit,$VAR['action'],$VAR['plugin']);
}
/**
* Invoices
*/
protected function invoices() {
global $VAR,$C_debug;
# 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 = sprintf('%s,%s',$VAR['offset'],$this->select_limit);
$remote_table = 'tblinvoices';
$ab_table = 'invoice';
# Select
$sql = sprintf('SELECT * FROM %s',$remote_table);
$rs = $dbr->SelectLimit($sql,$this->select_limit,$offset);
if ($rs === false) {
$C_debug->alert(sprintf('Query to the table "%s" failed!',$remote_table));
return false;
}
if ($rs->RecordCount() == 0) {
$C_debug->alert('No more records to process!');
printf("<script type='text/javascript' language=javascript>setTimeout('document.location=\'?_page=import:import&plugin=%s\'',1500);</script>",$VAR['plugin']);
return;
}
$db = &DB();
# Load Accounts Imported
$imprs = $db->Execute(sqlSelect($db,'import','ab_id,remote_id',sprintf('plugin=::%s:: AND action=::%s:: AND remote_table=::%s::',$this->plugin,'accounts','tblclients')));
while (! $imprs->EOF) {
$account[$imprs->fields['remote_id']] = $imprs->fields['ab_id'];
$imprs->MoveNext();
}
$msg = sprintf('Processing %s Records...<br/>',$rs->RecordCount());
$map = array();
# Our invoice ID should be preserved
$map['tax_amt'] = 'tax';
$map['total_amt'] = 'total';
# Loop through each remote item
while (! $rs->EOF) {
$msg .= sprintf('<br/>Processing : %s...',$rs->fields['id']);
# Start a new transaction for the insert:
$db = &DB();
$db->StartTrans();
$update = array();
foreach ($map as $a => $b)
$update[$a] = $rs->fields[$b];
# Strip the leading zeros
$rs->fields['userid'] *= 1;
$update['account_id'] = $account[$rs->fields['userid']];
# @todo Might be nice to automatically work out the currency
$update['billed_currency_id'] = 6;
$update['actual_billed_currency_id'] = 6;
$update['type'] = 1;
$update['date_orig'] = strtotime($rs->fields['date']);
$update['due_date'] = strtotime($rs->fields['duedate']);
$update['refund_status'] = 0;
$update['total_amt'] += $rs->fields['credit'];
switch ($rs->fields['status']) {
case 'Unpaid':
$update['billed_amt'] = 0;
$update['process_status'] = 1;
$update['billing_status'] = 0;
$update['status'] = 1;
break;
case 'Paid':
$update['billed_amt'] = $rs->fields['total']+$rs->fields['credit'];
$update['process_status'] = 1;
$update['billing_status'] = 1;
$update['status'] = 1;
break;
case 'Cancelled':
$update['billed_amt'] = 0;
$update['process_status'] = 0;
$update['billing_status'] = 0;
$update['status'] = 0;
break;
}
# Import the item
$db->Execute(sqlInsert($db,$ab_table,$update,$rs->fields['id']));
# Insert the import record
$this->import_transaction($this->plugin,$VAR['action'],$ab_table,$rs->fields['id'],$remote_table,$rs->fields['id'],$db);
# Complete the transaction
$db->CompleteTrans();
$rs->MoveNext();
}
$C_debug->alert($msg);
printf("<script type='text/javascript' language=javascript>setTimeout('document.location=\'?_page=core:blank&offset=%s&action=%s&plugin=%s&do[]=import:do_action\'', 1200);</script>",
$VAR['offset']+$this->select_limit,$VAR['action'],$VAR['plugin']);
}
/**
* Invoice Items
*/
protected function invoice_items() {
global $VAR,$C_debug;
# 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 = sprintf('%s,%s',$VAR['offset'],$this->select_limit);
$remote_table = 'tblinvoiceitems';
$ab_table = 'invoice_item';
# Select
$sql = sprintf('SELECT * FROM %s',$remote_table);
$rs = $dbr->SelectLimit($sql,$this->select_limit,$offset);
if ($rs === false) {
$C_debug->alert(sprintf('Query to the table "%s" failed!',$remote_table));
return false;
}
if ($rs->RecordCount() == 0) {
$C_debug->alert('No more records to process!');
printf("<script type='text/javascript' language=javascript>setTimeout('document.location=\'?_page=import:import&plugin=%s\'',1500);</script>",$VAR['plugin']);
return;
}
$db = &DB();
# Load Products Imported
$imprs = $db->Execute(sqlSelect($db,'import','ab_id,remote_id',sprintf('plugin=::%s:: AND action=::%s:: AND remote_table=::%s::',$this->plugin,'services','tblhosting')));
while (! $imprs->EOF) {
$service[$imprs->fields['remote_id']] = $imprs->fields['ab_id'];
$imprs->MoveNext();
}
# Load Accounts Imported
$imprs = $db->Execute(sqlSelect($db,'import','ab_id,remote_id',sprintf('plugin=::%s:: AND action=::%s:: AND remote_table=::%s::',$this->plugin,'accounts','tblclients')));
while (! $imprs->EOF) {
$account[$imprs->fields['remote_id']] = $imprs->fields['ab_id'];
$imprs->MoveNext();
}
# Load Domains Imported
$imprs = $db->Execute(sqlSelect($db,'import','ab_id,remote_id',sprintf('plugin=::%s:: AND action=::%s:: AND remote_table=::%s::',$this->plugin,'domains','tbldomains')));
while (! $imprs->EOF) {
$domain[$imprs->fields['remote_id']] = $imprs->fields['ab_id'];
$imprs->MoveNext();
}
# Load Products Imported
$imprs = $db->Execute(sqlSelect($db,'import','ab_id,remote_id',sprintf('plugin=::%s:: AND action=::%s:: AND remote_table=::%s::',$this->plugin,'products','tblproducts')));
while (! $imprs->EOF) {
$prod[$imprs->fields['remote_id']] = $imprs->fields['ab_id'];
$imprs->MoveNext();
}
$msg = sprintf('Processing %s Records...<br/>',$rs->RecordCount());
$map = array();
# Our invoice ID should be preserved
$map['invoice_id'] = 'invoiceid';
$map['product_name'] = 'description';
# Loop through each remote item
while (! $rs->EOF) {
$msg .= sprintf('<br/>Processing : %s...',$rs->fields['id']);
# Start a new transaction for the insert:
$db = &DB();
$db->StartTrans();
$update = array();
foreach ($map as $a => $b)
$update[$a] = $rs->fields[$b];
# Strip the leading zeros
$rs->fields['relid'] *= 1;
$rs->fields['userid'] *= 1;
$update['account_id'] = $account[$rs->fields['userid']];
$update['item_type'] = 3;
$update['price_type'] = 0;
$product = '';
switch ($rs->fields['type']) {
case 'Addon':
break;
case 'Domain':
if (isset($domain[$rs->fields['relid']]))
$update['service_id'] = $domain[$rs->fields['relid']];
$update['sku'] = 'DOMAIN-REGISTER';
break;
default:
if (isset($service[$rs->fields['relid']]))
$update['service_id'] = $service[$rs->fields['relid']];
# Get the Product
$dbr = &NewADOConnection($this->type);
$dbr->Connect($this->host,$this->user,$this->pass,$this->db);
$tldrs = $dbr->Execute(sprintf('SELECT packageid FROM tblhosting WHERE id=%s',$rs->fields['relid']));
if (isset($tldrs->fields['packageid'])) {
$tldrs->fields['packageid'] *= 1;
$update['product_id'] = $prod[$tldrs->fields['packageid']];
$db = &DB();
$sku = $db->Execute(sqlSelect($db,'product','sku',sprintf('id=%s',$update['product_id']),'','0,1'));
$update['sku'] = $sku->fields['sku'];
$prod_name = $dbr->Execute(sprintf('SELECT name,paytype from tblproducts WHERE id=%s',$tldrs->fields['packageid']));
$product = $prod_name->fields['name'];
if ($prod_name->fields['paytype'] == 'recurring') {
$update['price_type'] = 1;
$update['item_type'] = 0;
}
}
}
# Detect the dates and domain from the product_name
if ($update['product_name']) {
# Chop of the dates.
$reg = '/\s+\(([0-9]+\/[0-9]+\/[0-9]+)\s+-\s+([0-9]+\/[0-9]+\/[0-9]+)\)$/';
$matches = array();
if (preg_match($reg,$update['product_name'],$matches)) {
$update['date_start'] = strtotime(str_replace('/','-',$matches[1]));
$update['date_stop'] = strtotime(str_replace('/','-',$matches[2]));
$update['product_name'] = str_replace($matches[0],'',$update['product_name']);
# Find the domain portion
if (isset($product) && $product) {
$product_reg = str_replace('/','\/',$product);
if (preg_match("/^{$product_reg}\s+/",$update['product_name'])) {
$aaa = preg_replace("/^{$product_reg}\s+-\s+/",'',$update['product_name']);
if ($update['product_name'] != $product) {
$update['domain_name'] = $aaa;
$update['product_name'] = preg_replace("/\s+-\s+{$aaa}/",'',$update['product_name']);
}
}
}
}
}
$update['quantity'] = 1;
$update['tax_amt'] = sprintf('%3.2f',$rs->fields['amount']/11);
$update['total_amt'] = $rs->fields['amount']-$update['tax_amt'];
$update['price_base'] = $rs->fields['amount']-$update['tax_amt'];
# Import the item
$db = &DB();
$id = sqlGenID($db,$ab_table);
$result = $db->Execute(sqlInsert($db,$ab_table,$update,$id));
# Insert the import record
$this->import_transaction($this->plugin,$VAR['action'],$ab_table,$id,$remote_table,$rs->fields['id'],$db);
# Complete the transaction
$db->CompleteTrans();
$rs->MoveNext();
}
$C_debug->alert($msg);
printf("<script type='text/javascript' language=javascript>setTimeout('document.location=\'?_page=core:blank&offset=%s&action=%s&plugin=%s&do[]=import:do_action\'', 1200);</script>",
$VAR['offset']+$this->select_limit,$VAR['action'],$VAR['plugin']);
}
}
?>