function &loadFullCart($additionalInfos=false,$keepEmptyCart=false,$skipChecks=false){
$app = JFactory::getApplication();
$database = JFactory::getDBO();
$config =& hikashop_config();
$currencyClass = hikashop_get('class.currency');
$productClass = hikashop_get('class.product');
$main_currency = (int)$config->get('main_currency',1);
$currency_id = hikashop_getCurrency();
if(!in_array($currency_id,$currencyClass->publishedCurrencies())){
//if the selected currency can't be used for checkout use the main currency
$currency_id = $main_currency;
}
$zone_id = hikashop_getZone('shipping');
if($config->get('tax_zone_type','shipping')=='billing'){
$tax_zone_id=hikashop_getZone('billing');
}else{
$tax_zone_id=$zone_id;
}
$discount_before_tax = (int)$config->get('discount_before_tax',0);
$cart = new stdClass();
$cart->products = $this->get(@$this->cart->cart_id, $keepEmptyCart);
$cart->cart_id = (int)@$this->cart->cart_id;
$cart->cart_type = @$this->cart->cart_type;
$cart->cart_params = @$this->cart->cart_params;
$cart->coupon = null;
$cart->shipping = null;
$cart->total = null;
$cart->additional = array();
if(!empty($cart->products)){
$ids = array();
foreach($cart->products as $product){
$ids[]=$product->product_id;
}
JArrayHelper::toInteger($ids);
$query = 'SELECT * FROM '.hikashop_table('file').' WHERE file_ref_id IN ('.implode(',',$ids).') AND file_type IN( \'product\',\'file\') ORDER BY file_ref_id ASC, file_ordering ASC';
$database->setQuery($query);
$images = $database->loadObjectList();
if(!empty($images)){
foreach($cart->products as $k => $row){
$productClass->addFiles($cart->products[$k],$images);
}
}
//add variants inside main products as reference for tax calculus
foreach($cart->products as $k => $row){
if($row->product_type=='variant'){
foreach($cart->products as $k2 => $row2){
if($row->product_parent_id==$row2->product_id){
$cart->products[$k2]->variants[]=&$cart->products[$k];
break;
}
}
}
}
//add the characteristics infos
$query = 'SELECT a.*,b.* FROM '.hikashop_table('variant').' AS a LEFT JOIN '.hikashop_table('characteristic').' AS b ON a.variant_characteristic_id=b.characteristic_id WHERE a.variant_product_id IN ('.implode(',',$ids).') ORDER BY a.ordering,b.characteristic_value';
$database->setQuery($query);
$characteristics = $database->loadObjectList();
if(!empty($characteristics)){
foreach($cart->products as $key => $product){
if($product->product_type!='variant'){
$element =& $cart->products[$key];
$product_id=$product->product_id;
$mainCharacteristics = array();
foreach($characteristics as $characteristic){
if($product_id==$characteristic->variant_product_id){
$mainCharacteristics[$product_id][$characteristic->characteristic_parent_id][$characteristic->characteristic_id]=$characteristic;
}
if(!empty($element->options)){
foreach($element->options as $k => $optionElement){
if($optionElement->product_id==$characteristic->variant_product_id){
$mainCharacteristics[$optionElement->product_id][$characteristic->characteristic_parent_id][$characteristic->characteristic_id]=$characteristic;
}
}
}
}
if(!empty($element->variants)){
$this->addCharacteristics($element,$mainCharacteristics,$characteristics);
}
if(!empty($element->options)){
foreach($element->options as $k => $optionElement){
if(!empty($optionElement->variants)){
$this->addCharacteristics($element->options[$k],$mainCharacteristics,$characteristics);
}
}
}
}
}
}
//calculate prices
$product_quantities = array();
foreach($cart->products as $row){
if(empty($product_quantities[$row->product_id])){
$product_quantities[$row->product_id] = (int)@$row->cart_product_quantity;
}else{
$product_quantities[$row->product_id]+=(int)@$row->cart_product_quantity;
}
if(empty($product_quantities[$row->product_parent_id])){
$product_quantities[$row->product_parent_id] = (int)@$row->cart_product_quantity;
}else{
$product_quantities[$row->product_parent_id] += (int)@$row->cart_product_quantity;
}
}
foreach($cart->products as $k => $row){
$cart->products[$k]->cart_product_total_quantity = $product_quantities[$row->product_id];
if($row->product_parent_id){
$cart->products[$k]->cart_product_total_variants_quantity = $product_quantities[$row->product_parent_id];
}else{
$cart->products[$k]->cart_product_total_variants_quantity = $cart->products[$k]->cart_product_total_quantity;
}
}
$currencyClass->getPrices($cart->products,$ids,$currency_id,$main_currency,$tax_zone_id,$discount_before_tax);
if($additionalInfos){
$queryImage = 'SELECT * FROM '.hikashop_table('file').' WHERE file_ref_id IN ('.implode(',',$ids).') AND file_type=\'product\' ORDER BY file_ref_id ASC, file_ordering ASC, file_id ASC';
$database->setQuery($queryImage);
$images = $database->loadObjectList();
foreach($cart->products as $k=>$row){
if(!empty($images)){
foreach($images as $image){
if($row->product_id==$image->file_ref_id){
if(!isset($row->file_ref_id)){
foreach(get_object_vars($image) as $key => $name){
$cart->products[$k]->$key = $name;
}
}
break;
}
}
}
if(!isset($cart->products[$k]->file_name)){
$cart->products[$k]->file_name = $row->product_name;
}
}
}
foreach($cart->products as $k => $row){
if(!empty($row->variants)){
foreach($row->variants as $k2 => $variant){
$productClass->checkVariant($cart->products[$k]->variants[$k2],$row);
}
}
}
//check that products are still published etc
$notUsable = array();
$cartData = $this->loadCart($cart->cart_id);
if(!$skipChecks){
$cart->products = array_reverse($cart->products);
foreach($cart->products as $k => $product){
if(empty($product->product_id)){
continue;
}
if(!empty($product->cart_product_quantity)){
$oldQty = $product->cart_product_quantity;
if(@$cartData->cart_type != 'wishlist')
$this->_checkQuantity($product,$product->cart_product_quantity,$cart->products,$product->cart_product_id);
if($oldQty!=$product->cart_product_quantity){
$notUsable[$product->cart_product_id]=0;
break;
}
if(!$config->get('display_add_to_cart_for_free_products',0) && empty($product->prices)){
$notUsable[$product->cart_product_id]=0;
$app->enqueueMessage(JText::sprintf('PRODUCT_NOT_AVAILABLE',$product->product_name),'notice');
continue;
}
if(empty($product->product_published)){
$notUsable[$product->cart_product_id]=0;
$app->enqueueMessage(JText::sprintf('PRODUCT_NOT_AVAILABLE',$product->product_name),'notice');
continue;
}
if($product->product_quantity!=-1 && $product->product_quantity < $product->cart_product_quantity){
$notUsable[$product->cart_product_id]=0;
$app->enqueueMessage(JText::sprintf('NOT_ENOUGH_STOCK_FOR_PRODUCT',$product->product_name),'notice');
continue;
}
if($product->product_sale_start>time()){
$notUsable[$product->cart_product_id]=0;
$app->enqueueMessage(JText::sprintf('PRODUCT_NOT_YET_ON_SALE',$product->product_name),'notice');
continue;
}
if(!empty($product->product_sale_end) && $product->product_sale_end<time()){
$notUsable[$product->cart_product_id]=0;
$app->enqueueMessage(JText::sprintf('PRODUCT_NOT_SOLD_ANYMORE',$product->product_name),'notice');
continue;
}
}
}
$cart->products = array_reverse($cart->products);
}
if(!empty($notUsable)){
//if we need to remove products from the cart do so and then reload the cart
$this->update($notUsable,1,0,'item');
return $this->loadFullCart($additionalInfos);
}
foreach($cart->products as $k => $row){
//we unset the cart coupon and modified date in order to avoid the auto load hash on the products to be different if only the coupon of the cart changed
unset($cart->products[$k]->cart_modified);
unset($cart->products[$k]->cart_coupon);
$currencyClass->calculateProductPriceForQuantity($cart->products[$k]);
}
$currencyClass->calculateTotal($cart->products,$cart->total,$currency_id);
$cart->full_total=&$cart->total;
JPluginHelper::importPlugin('hikashop');
JPluginHelper::importPlugin('hikashoppayment');
JPluginHelper::importPlugin('hikashopshipping');
$dispatcher = JDispatcher::getInstance();
$dispatcher->trigger('onAfterCartProductsLoad', array( &$cart ) );
if(!empty($cart->additional)) {
$currencyClass->addAdditionals($cart->additional, $cart->additional_total, $cart->full_total, $currency_id);
$cart->full_total =& $cart->additional_total;
}
if(!empty($this->cart->cart_coupon) && $cart->cart_type != 'wishlist'){
$discount=hikashop_get('class.discount');
$discountData = $discount->load($this->cart->cart_coupon);
if(@$discountData->discount_auto_load){
$current_auto_coupon_key = sha1($zone_id.'_'.serialize($cart->products).'_'.hikashop_loadUser());
$previous_auto_coupon_key = $app->getUserState( HIKASHOP_COMPONENT.'.auto_coupon_key');
if($current_auto_coupon_key!=$previous_auto_coupon_key){
$this->cart->cart_coupon='';
}
}
}
if(hikashop_level(1) && empty($this->cart->cart_coupon) && $cart->cart_type != 'wishlist'){
$filters = array('discount_type=\'coupon\'','discount_published=1','discount_auto_load=1');
hikashop_addACLFilters($filters,'discount_access');
$query = 'SELECT * FROM '.hikashop_table('discount').' WHERE '.implode(' AND ',$filters).' ORDER BY discount_minimum_order DESC, discount_minimum_products DESC';
$this->database->setQuery($query);
$coupons = $this->database->loadObjectList();
if(!empty($coupons)){
$discount = hikashop_get('class.discount');
$zoneClass = hikashop_get('class.zone');
$zones = $zoneClass->getZoneParents($zone_id);
foreach($coupons as $coupon){
$result = $discount->check($coupon,$cart->total,$zones,$cart->products,false);
if($result){
//if we found a coupon to auto load add the coupon to the cart and reload the cart
$auto_coupon_key = sha1($zone_id.'_'.serialize($cart->products).'_'.hikashop_loadUser());
$app->setUserState( HIKASHOP_COMPONENT.'.auto_coupon_key',$auto_coupon_key);
$app->setUserState( HIKASHOP_COMPONENT.'.coupon_code','');
$this->update($coupon->discount_code,1,0,'coupon',true);
if(empty($this->cart))
$this->cart= new stdClass();
$this->cart->cart_coupon = $coupon->discount_code;
static $done = false;
if($done == false){
$done = true;
return $this->loadFullCart($additionalInfos);
}
}
}
}
}
if(!empty($this->cart->cart_coupon) && $cart->cart_type != 'wishlist') {
$zoneClass = hikashop_get('class.zone');
$zones = $zoneClass->getZoneParents($zone_id);
$cart->coupon = $discount->loadAndCheck($this->cart->cart_coupon, $cart->full_total, $zones, $cart->products, true);
if(empty($cart->coupon)) {
if(!empty($this->cart))
$this->cart->cart_coupon = '';
} else {
$cart->full_total = &$cart->coupon->total;
}
}
if(bccomp($cart->full_total->prices[0]->price_value_with_tax, 0, 5) <= 0) {
$cart->full_total->prices[0]->price_value_with_tax = 0;
$cart->full_total->prices[0]->price_value = 0;
if(isset($cart->full_total->prices[0]->taxes))
unset($cart->full_total->prices[0]->taxes);
}
$shipping_id = $app->getUserState(HIKASHOP_COMPONENT.'.shipping_id');
if(!empty($shipping_id)) {
$cart->shipping = $app->getUserState(HIKASHOP_COMPONENT.'.shipping_data');
if(!empty($cart->shipping)) {
if(!is_array($cart->shipping)){
$cart->shipping = array($cart->shipping);
}else{
//make sure that there are no shipping methods entered twice in the selected shipping data.
$shippings = array();
foreach($cart->shipping as $method){
$group_key = $method->shipping_id;
if(!empty($method->shipping_warehouse_id)){
$group_key .= '_';
if(is_array($method->shipping_warehouse_id)){
foreach($method->shipping_warehouse_id as $key => $val){
$group_key .= $key.$val;
}
}else{
$group_key .= $method->shipping_warehouse_id;
}
}
$shippings[$group_key]=$method;
}
$cart->shipping = array_values($shippings);
}
$currencyClass = hikashop_get('class.currency');
$shipping =& $cart->shipping;
$currencyClass->processShippings($shipping,$cart);
//calculate total price with shipping
$cart->full_total =& $currencyClass->addShipping($cart->shipping, $cart->full_total);
}
}
$before_additional = !empty($cart->additional);
$dispatcher->trigger('onAfterCartShippingLoad', array( &$cart ) );
if(!$before_additional && !empty($cart->additional)) {
$currencyClass->addAdditionals($cart->additional, $cart->additional_total, $cart->full_total, $currency_id);
$cart->full_total =& $cart->additional_total;
}
if(bccomp($cart->full_total->prices[0]->price_value_with_tax,0,5)<=0){
$cart->full_total->prices[0]->price_value_with_tax = 0;
$cart->full_total->prices[0]->price_value = 0;
if(isset($cart->full_total->prices[0]->taxes)) unset($cart->full_total->prices[0]->taxes);
}
$payment_id = $app->getUserState( HIKASHOP_COMPONENT.'.payment_id');
if(!empty($payment_id)){
$cart->payment = $app->getUserState( HIKASHOP_COMPONENT.'.payment_data');
if(!empty($cart->payment)){
$currencyClass = hikashop_get('class.currency');
$payment =& $cart->payment;
$payments = array(&$payment);
$currencyClass->processPayments($payments);
//calculate total price with payment
$currencyClass->addPayment($cart->payment,$cart->full_total);
$cart->full_total=&$cart->payment->total;
}
}
}
if($additionalInfos){
$app = JFactory::getApplication();
$shipping_address=$app->getUserState( HIKASHOP_COMPONENT.'.shipping_address',0);
if(!empty($shipping_address)){
$this->loadAddress($cart,$shipping_address);
}
$billing_address=$app->getUserState( HIKASHOP_COMPONENT.'.billing_address',0);
if($billing_address==$shipping_address){
$cart->billing_address =& $cart->shipping_address;
}else{
if(!empty($billing_address)){
$this->loadAddress($cart,$billing_address,'parent','billing');
}
}
$this->calculateWeightAndVolume($cart);
}
return $cart;
}