<?php
|
|
/**
|
|
* This file is a part of Quasi CMS
|
|
*@package Quasi
|
|
*/
|
|
|
|
require_once('../../includes/prepend.inc.php');
|
|
require('QuasiDBI.php');
|
|
|
|
/**
|
|
* This class imports OsCommerce tables into Quasi.
|
|
* Actions are as follows:
|
|
* 1. Get the addresses and customer accounts, addresses are many to one with customers so they
|
|
* are the first part of a left join. We loop through the addresses and save for each account.
|
|
* 2. On the first loop for a customer Id, Create an Account for the customer. This uses the customers
|
|
* and address_book tables to create the Person associated with the Account.
|
|
* 3. Retrieve orders, totals and order_status_history from OSC tables for the customer (first pass only).
|
|
This in turn calculates order_totals and translates order_status_history for each order found.
|
|
At this point we also import products and order_items
|
|
* 4. Save addresses for each additional pass with this customer id.
|
|
*
|
|
*@todo
|
|
* - set the image file for products
|
|
* - import categories
|
|
* - import and set manufacturer
|
|
* - generally test, debug and improve; this is largely untested code except for one tailored import ..(08/29/08)
|
|
*
|
|
*@author Erik Winn <erikwinnmail@yahoo.com>
|
|
*
|
|
* $Id: ImportOsCommerce.class.php 324 2008-10-28 22:11:39Z erikwinn $
|
|
*@version 0.1
|
|
*
|
|
*@copyright (C) 2008 by Erik Winn
|
|
*@license GPL v.2
|
|
|
|
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 2 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, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA
|
|
|
|
*
|
|
*@package Quasi
|
|
*/
|
|
|
|
class ImportOsCommerce
|
|
{
|
|
protected $objAccount = null;
|
|
protected $objPerson = null;
|
|
// protected $objAddress = null;
|
|
|
|
protected $objDBI = null;
|
|
|
|
protected $intCurrentImportId = null;
|
|
|
|
protected $strAccountInfoQuery = 'SELECT address_book.address_book_id,
|
|
address_book.customers_id as entry_customers_id,
|
|
address_book.entry_gender,
|
|
address_book.entry_company,
|
|
address_book.entry_firstname,
|
|
address_book.entry_lastname,
|
|
address_book.entry_street_address,
|
|
address_book.entry_suburb,
|
|
address_book.entry_postcode,
|
|
address_book.entry_city,
|
|
address_book.entry_state,
|
|
address_book.entry_country_id,
|
|
address_book.entry_zone_id,
|
|
address_book.entry_street_address2,
|
|
customers.customers_id,
|
|
customers.customers_gender,
|
|
customers.customers_firstname,
|
|
customers.customers_lastname,
|
|
customers.customers_dob,
|
|
customers.customers_email_address,
|
|
customers.customers_default_address_id,
|
|
customers.customers_telephone,
|
|
customers.customers_fax,
|
|
customers.customers_password,
|
|
customers.customers_newsletter,
|
|
customers_info.customers_info_date_of_last_logon,
|
|
customers_info.customers_info_number_of_logons,
|
|
customers_info.customers_info_date_account_created
|
|
FROM address_book
|
|
LEFT JOIN customers ON customers.customers_id = address_book.customers_id
|
|
LEFT JOIN customers_info ON customers_info.customers_info_id = customers.customers_id
|
|
GROUP BY address_book.customers_id
|
|
';
|
|
public function __construct()
|
|
{
|
|
$this->objDBI = QuasiDBI::getInstance();
|
|
if(! $this->objDBI instanceof QuasiDBI)
|
|
echo('Failed to get database handle ..');
|
|
}
|
|
|
|
public function Run()
|
|
{
|
|
$intPreviousId = null;
|
|
$intPersonId = null;
|
|
$intDefaultAddressId = null;
|
|
$aryAddresses = array();
|
|
|
|
$this->objDBI->doQuery($this->strAccountInfoQuery);
|
|
while($aryRow = $this->objDBI->nextRow() )
|
|
{
|
|
$this->intCurrentImportId = $aryRow['entry_customers_id'];
|
|
if('root@localhost' == $aryRow['customers_email_address'])
|
|
continue;
|
|
|
|
if(!$this->intCurrentImportId )
|
|
{
|
|
echo "Warning address_book customers id is Null! Address Id: " . $aryRow['address_book_id'] ;
|
|
continue;
|
|
}
|
|
//if we are not in loop to handle multiple addresses, create new account.
|
|
if($intPreviousId !== $this->intCurrentImportId || null == $intPreviousId )
|
|
{
|
|
//clear the address stack
|
|
$aryAddresses = array();
|
|
$this->importAccount($aryRow);
|
|
$this->importOrders($this->intCurrentImportId);
|
|
}
|
|
|
|
//First address type defaults to Primary
|
|
if( empty( $aryAddresses ))
|
|
$intTypeId = AddressType::Primary;
|
|
elseif( $aryRow['address_book_id'] == $aryRow['customers_default_address_id'] )
|
|
{//in case primary was set by defualt, adjust types ..
|
|
foreach($aryAddresses as $objAddress )
|
|
{
|
|
if(AddressType::Primary == $objAddress->TypeId )
|
|
{
|
|
$objAddress->TypeId = AddressType::Shipping;
|
|
$objAddress->Save();
|
|
}
|
|
}
|
|
$intTypeId = AddressType::Primary;
|
|
}
|
|
else //additional addresses default to Billing ..
|
|
$intTypeId = AddressType::Billing;
|
|
|
|
$aryAddresses[] = $this->importAddress($aryRow, $intTypeId);
|
|
$intPreviousId = $this->intCurrentImportId;
|
|
}
|
|
|
|
}
|
|
/**
|
|
*
|
|
*/
|
|
protected function importAccount($aryRow)
|
|
{
|
|
$this->objAccount = new Account;
|
|
$this->objPerson = new Person;
|
|
|
|
///First create a Person ..
|
|
//remove TEMP garbage from oscommerce name columns - this may have been local junk ..
|
|
if( strpos('TEMP', $aryRow['customers_firstname']) === false )
|
|
{
|
|
$this->objPerson->FirstName = $aryRow['entry_firstname'];
|
|
$this->objPerson->LastName = $aryRow['entry_lastname'];
|
|
}
|
|
else
|
|
{
|
|
$this->objPerson->FirstName = $aryRow['customers_firstname'];
|
|
$this->objPerson->LastName = $aryRow['customers_lastname'];
|
|
}
|
|
$this->objPerson->CompanyName = $aryRow['entry_company'];
|
|
$this->objPerson->EmailAddress = $aryRow['customers_email_address'];
|
|
$this->objPerson->PhoneNumber = $aryRow['customers_telephone'];
|
|
$this->objPerson->Save();
|
|
|
|
///associate the Account and Address with this person
|
|
$this->objAccount->PersonId = $this->objPerson->Id;
|
|
$objAddress->PersonId = $this->objPerson->Id;
|
|
|
|
/// transfer Account values - Note: this assumes import to a virgin database ..
|
|
/// Quasi login supports OsCommerce style password encryption so we do not change login info
|
|
$this->objAccount->Password = $aryRow['customers_password'];
|
|
$this->objAccount->Username = $aryRow['customers_email_address'];
|
|
$this->objAccount->RegistrationDate = $aryRow['customers_info_date_account_created'];
|
|
$this->objAccount->LastLogin = $aryRow['customers_info_date_of_last_logon'];
|
|
$this->objAccount->LoginCount = $aryRow['customers_info_number_of_logons'];
|
|
$this->objAccount->TypeId = AccountType::Customer;
|
|
$this->objAccount->StatusId = AccountStatusType::Active;
|
|
$this->objAccount->Save();
|
|
}
|
|
/**
|
|
*
|
|
*/
|
|
protected function importAddress($aryRow, $intTypeId)
|
|
{
|
|
$objAddress = new Address;
|
|
|
|
$strState = trim($aryRow['entry_state']);
|
|
|
|
$objAddress->PersonId = $this->objPerson->Id;
|
|
$objAddress->Street1 = $aryRow['entry_street_address'];
|
|
$objAddress->Street2 = $aryRow['entry_street_address2'];
|
|
$objAddress->Suburb = $aryRow['entry_suburb'];
|
|
$objAddress->City = $aryRow['entry_city'];
|
|
|
|
if($aryRow['entry_zone_id'] > 0)
|
|
$objAddress->ZoneId = $aryRow['entry_zone_id'];
|
|
elseif('' != $strState)
|
|
{
|
|
$objAddress->ZoneId = ZoneType::GetId($strState);
|
|
if(ZoneType::NoZone == $objAddress->ZoneId)
|
|
$objAddress->County = $strState;
|
|
}
|
|
else
|
|
$objAddress->ZoneId = ZoneType::NoZone;
|
|
|
|
if($aryRow['entry_country_id'] > 0)
|
|
$objAddress->CountryId = $aryRow['entry_country_id'];
|
|
elseif('' != $strState && CountryType::GetId($strState != CountryType::World))//international orders sometimes do this ..
|
|
$objAddress->CountryId = CountryType::GetId($strState);
|
|
else
|
|
$objAddress->CountryId = ZoneType::$ExtraColumnValuesArray[$objAddress->ZoneId]['CountryId'];
|
|
|
|
$objAddress->PostalCode = $aryRow['entry_postcode'];
|
|
$objAddress->TypeId = $intTypeId;
|
|
|
|
$objAddress->Save();
|
|
return $objAddress;
|
|
}
|
|
|
|
protected function importOrders($intAccountId)
|
|
{
|
|
$q = 'SELECT * FROM orders WHERE customers_id = ' . $intAccountId;
|
|
$objResultSet = $this->objDBI->doQuery($q, true);
|
|
while($aryRow = $this->objDBI->nextRow($objResultSet))
|
|
{
|
|
$objOrder = new Order();
|
|
$objOrder->AccountId = $this->objAccount->Id;
|
|
$objOrder->Id = $aryRow['orders_id'];
|
|
$objOrder->CreationDate = $aryRow['date_purchased'];
|
|
$objOrder->LastModificationDate = $aryRow['last_modified'];
|
|
$objOrder->CompletionDate = $aryRow['orders_date_finished'];
|
|
|
|
$strPaymentMethod = $aryRow['payment_method'];
|
|
if( false !== strpos( $strPaymentMethod, 'Authorize.net' ) )
|
|
$objOrder->PaymentMethodId = 3;
|
|
elseif( false !== strpos( $strPaymentMethod, 'PayPal' ) )
|
|
$objOrder->PaymentMethodId = 2;
|
|
else
|
|
$objOrder->PaymentMethodId = 1;
|
|
|
|
$objOrder->ShippingMethodId = 1;
|
|
$strShippingMethod = $aryRow['shipping_method'];
|
|
if( false !== strpos( $strShippinMethod, 'USPS' ) || false !== strpos( $strShippinMethod, 'United States Postal' ))
|
|
{
|
|
if( false !== strpos( $strShippinMethod, 'Priority' ) )
|
|
if( false !== strpos( $strShippinMethod, 'Global' ) )
|
|
$objOrder->ShippingMethodId = 7;
|
|
else
|
|
$objOrder->ShippingMethodId = 3;
|
|
elseif( false !== strpos( $strShippinMethod, 'First' ) )
|
|
if( false !== strpos( $strShippinMethod, 'International' ) )
|
|
$objOrder->ShippingMethodId = 8;
|
|
else
|
|
$objOrder->ShippingMethodId = 2;
|
|
elseif( false !== strpos( $strShippinMethod, 'Express' ) || false !== strpos( $strShippinMethod, 'EXPRESS' ))
|
|
if( false !== strpos( $strShippinMethod, 'Global' ) )
|
|
$objOrder->ShippingMethodId = 8;
|
|
else
|
|
$objOrder->ShippingMethodId = 2;
|
|
|
|
}
|
|
elseif( false !== strpos( $strShippinMethod, 'FedEx' ) || false !== strpos( $strShippinMethod, 'Federal Express' ))
|
|
{
|
|
if( false !== strpos( $strShippinMethod, '2 Day' ) )
|
|
$objOrder->ShippingMethodId = 10;
|
|
elseif( false !== strpos( $strShippinMethod, 'Ground' ) || false !== strpos( $strShippinMethod, 'Home' ) )
|
|
$objOrder->ShippingMethodId = 9;
|
|
elseif( false !== strpos( $strShippinMethod, 'Standard Overnight' ) )
|
|
$objOrder->ShippingMethodId = 11;
|
|
}
|
|
|
|
$intStatusId = $aryRow['orders_status'];
|
|
$objOrder->StatusId = $this->translateStatusId($intStatusId);
|
|
|
|
$aryName = explode(' ', $aryRow['delivery_name'] );
|
|
|
|
$objOrder->ShippingFirstName = $aryName[0];
|
|
$objOrder->ShippingLastName = $aryName[1];
|
|
$objOrder->ShippingStreet1 = $aryRow['delivery_street_address'];
|
|
$objOrder->ShippingStreet2 = $aryRow['delivery_street_address2'];
|
|
$objOrder->ShippingSuburb = $aryRow['delivery_suburb'];
|
|
$objOrder->ShippingCity = $aryRow['delivery_city'];
|
|
$objOrder->ShippingZoneId = ZoneType::GetId( $aryRow['delivery_state']);
|
|
$objOrder->ShippingCountryId = CountryType::GetId( $aryRow['delivery_country']);
|
|
$objOrder->ShippingPostalCode = $aryRow['delivery_postcode'];
|
|
|
|
$aryName = explode(' ', $aryRow['billing_name'] );
|
|
|
|
$objOrder->BillingFirstName = $aryName[0];
|
|
$objOrder->BillingLastName = $aryName[1];
|
|
$objOrder->BillingStreet1 = $aryRow['billing_street_address'];
|
|
$objOrder->BillingStreet2 = $aryRow['billing_street_address2'];
|
|
$objOrder->BillingSuburb = $aryRow['billing_suburb'];
|
|
$objOrder->BillingCity = $aryRow['billing_city'];
|
|
$objOrder->BillingZoneId = ZoneType::GetId( $aryRow['billing_state']);
|
|
$objOrder->BillingCountryId = CountryType::GetId( $aryRow['billing_country']);
|
|
$objOrder->BillingPostalCode = $aryRow['billing_postcode'];
|
|
|
|
$objOrder->Insert();
|
|
$objOrder->Reload();
|
|
|
|
$this->importOrderItems($objOrder->Id);
|
|
$this->importOrderHistory($objOrder->Id);
|
|
$this->importOrderTotals($objOrder);
|
|
|
|
$objOrder->HandlingCharged = 10.00;
|
|
$objOrder->Save();
|
|
}
|
|
|
|
|
|
}
|
|
/**
|
|
*
|
|
*/
|
|
protected function importOrderTotals($objOrder)
|
|
{
|
|
$q = 'SELECT * FROM orders_total WHERE orders_id = ' . $objOrder->Id;
|
|
$objResultSet = $this->objDBI->doQuery($q, true);
|
|
while($aryRow = $this->objDBI->nextRow($objResultSet))
|
|
{
|
|
switch($aryRow['class'])
|
|
{
|
|
case 'ot_total':
|
|
break;//ignore ..
|
|
case 'ot_subtotal':
|
|
$objOrder->ProductTotalCharged = $aryRow['value'];
|
|
break;
|
|
case 'ot_shipping':
|
|
$fltShipping = ($aryRow['value'] - 10);
|
|
$objOrder->ShippingCharged = $fltShipping;
|
|
break;
|
|
case 'ot_tax':
|
|
$objOrder->Tax = $aryRow['value'];
|
|
break;
|
|
default:
|
|
print('Warning: Unknown orders_total class:' . $aryRow['class']);
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
*
|
|
*/
|
|
protected function importOrderItems($intOrderId)
|
|
{
|
|
$q = 'SELECT * FROM orders_products WHERE orders_id = ' . $intOrderId;
|
|
$objResultSet = $this->objDBI->doQuery($q, true);
|
|
$fltTotal = 0;
|
|
while($aryRow = $this->objDBI->nextRow($objResultSet))
|
|
{
|
|
$objOrderItem = new OrderItem();
|
|
|
|
$objOrderItem->OrderId = $intOrderId;
|
|
$objOrderItem->ProductId = $aryRow['products_id'];
|
|
$objOrderItem->Quantity = $aryRow['products_quantity'];
|
|
if( is_numeric($objOrderItem->ProductId)
|
|
&& $objOrderItem->ProductId > 0
|
|
&& $objOrderItem->ProductId < 16777215)
|
|
$this->importProduct($objOrderItem->ProductId);
|
|
else
|
|
continue;
|
|
|
|
$objOrderItem->Save();
|
|
|
|
$fltPrice = $aryRow['final_price'];
|
|
$fltTotal += ( $fltPrice * $objOrderItem->Quantity );
|
|
|
|
}
|
|
return $fltTotal;
|
|
}
|
|
/**
|
|
*
|
|
*/
|
|
protected function importOrderHistory($intOrderId)
|
|
{
|
|
$aryHistories = array();
|
|
|
|
$q = 'SELECT * FROM orders_status_history WHERE orders_id = ' . $intOrderId;
|
|
$objResultSet = $this->objDBI->doQuery($q, true);
|
|
while($aryRow = $this->objDBI->nextRow($objResultSet))
|
|
{
|
|
if(6 == $aryRow['orders_status_id'])
|
|
continue;
|
|
|
|
$objStatusHistory = new OrderStatusHistory();
|
|
$objStatusHistory->OrderId = $intOrderId;
|
|
$objStatusHistory->Date = $aryRow['date_added'];
|
|
|
|
$objStatusHistory->StatusId = $this->translateStatusId($aryRow['orders_status_id']);
|
|
$objStatusHistory->Notes = $aryRow['comments'];
|
|
|
|
foreach($aryHistories as $idx_1 => &$objStackedHistory)
|
|
{
|
|
if($objStackedHistory->Date == $objStatusHistory->Date)
|
|
{
|
|
//remove PayPal double notifications ..
|
|
if($objStatusHistory->StatusId == OrderStatusType::Pending)
|
|
continue 2;
|
|
elseif($objStackedHistory->StatusId == OrderStatusType::Pending)
|
|
unset($aryHistories[$idx_1]);
|
|
//random duplicates
|
|
elseif( $objHistory->StatusId == $objStatusHistory->StatusId)
|
|
unset($aryHistories[$idx_1]);
|
|
else
|
|
foreach($aryHistories as $idx_2 => &$objHistory)
|
|
if( $objHistory->StatusId == $objStatusHistory->StatusId)
|
|
unset($aryHistories[$idx_2]);
|
|
}
|
|
}
|
|
$aryHistories[] = $objStatusHistory;
|
|
}
|
|
|
|
foreach( $aryHistories as $objHistory )
|
|
if($objHistory instanceof OrderStatusHistory)
|
|
$objHistory->InsertDated();
|
|
}
|
|
/**
|
|
*
|
|
*/
|
|
protected function importProduct($intProductId)
|
|
{
|
|
$objProduct = Product::Load($intProductId);
|
|
if( $objProduct instanceof Product )
|
|
return true;
|
|
|
|
$q = 'SELECT p.*, pd.products_name, pd.products_description
|
|
FROM products AS p
|
|
JOIN products_description AS pd ON pd.products_id = p.products_id
|
|
WHERE p.products_id ='. $intProductId;
|
|
|
|
$aryRow = $this->objDBI->fetchRow($q);
|
|
$objProduct = new Product();
|
|
$objProduct->Id = $intProductId;
|
|
$objProduct->CreationDate = $aryRow['products_date_added'];
|
|
$objProduct->IsVirtual = false;
|
|
$objProduct->TypeId = ProductType::Storefront;
|
|
$objProduct->StatusId = ProductStatusType::Active;
|
|
$objProduct->ManufacturerId = $aryRow['manufacturer_id'];
|
|
$objProduct->SupplierId = 1; //default to store owner ..
|
|
|
|
$objProduct->UserPermissionsId = PermissionType::Delete;
|
|
$objProduct->PublicPermissionsId = PermissionType::View;
|
|
$objProduct->GroupPermissionsId = PermissionType::View;
|
|
|
|
$objProduct->RetailPrice = $aryRow['products_price'];
|
|
$objProduct->Weight = $aryRow['products_weight'];
|
|
|
|
if ( '' != $aryRow['products_model'])
|
|
$objProduct->Model = $aryRow['products_model'];
|
|
else
|
|
$objProduct->Model = 'Model_' . $intProductId;
|
|
|
|
if ( '' != $aryRow['products_name'])
|
|
$objProduct->Name = $aryRow['products_name'];
|
|
else
|
|
$objProduct->Name = 'Product #' . $intProductId;
|
|
|
|
if ( '' != $aryRow['products_description'])
|
|
$objProduct->LongDescription = $aryRow['products_description'];
|
|
else
|
|
$objProduct->LongDescription = 'No product description available.';
|
|
|
|
/* FTR - other things we may want to import .. currently disabled
|
|
if ( '' != $aryRow['Manufacturer']) $objProduct->ManufacturerId = $aryRow['Manufacturer'];
|
|
if ( '' != $aryRow['Supplier']) $objProduct->SupplierId = $aryRow['Supplier'];
|
|
if ( '' != $aryRow['ShortDescription']) $objProduct->ShortDescription = $aryRow['ShortDescription'];
|
|
if ( '' != $aryRow['Msrp']) $objProduct->Msrp = $aryRow['Msrp'];
|
|
if ( '' != $aryRow['WholesalePrice']) $objProduct->WholesalePrice = $aryRow['WholesalePrice'];
|
|
if ( '' != $aryRow['Cost']) $objProduct->Cost = $aryRow['Cost'];
|
|
if ( '' != $aryRow['IsVirtual']) $aryRow['IsVirtual'];
|
|
if ( '' != $aryRow['Type'])$aryRow['Type'];
|
|
if ( '' != $aryRow['Status']) = $aryRow['Status'];
|
|
if ( '' != $aryRow['ViewCount']) $objProduct->ViewCount = $aryRow['ViewCount'];
|
|
*/
|
|
|
|
$objProduct->InsertWithId();
|
|
return true;
|
|
}
|
|
/**
|
|
* This function translates an OsCommerce status to Quasi - customize to suit ..
|
|
*/
|
|
protected function translateStatusId($intStatusId)
|
|
{
|
|
switch($intStatusId)
|
|
{
|
|
case 1:
|
|
return OrderStatusType::Paid;
|
|
break;
|
|
case 2: //invoice printed
|
|
case 3: //label printed
|
|
case 4: //shipped
|
|
return OrderStatusType::Shipped;
|
|
break;
|
|
case 12:
|
|
return OrderStatusType::Processing;
|
|
break;
|
|
case 14:
|
|
return OrderStatusType::Cancelled;
|
|
break;
|
|
case 15: //preparing paypal ..
|
|
return OrderStatusType::Pending;
|
|
break;
|
|
case 16:
|
|
return OrderStatusType::Processing;
|
|
break;
|
|
default:
|
|
return OrderStatusType::Shipped;
|
|
}
|
|
}
|
|
}
|
|
?>
|