| Server IP : 85.158.181.41 / Your IP : 216.73.217.12 Web Server : Apache System : Linux cloud9-vm129 6.1.178+1-ph #ph SMP PREEMPT_DYNAMIC Wed Jul 29 09:00:54 UTC 2026 x86_64 User : moncbefd ( 1024) PHP Version : 7.3.33 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/moncbefd/www.moneta.at/includes/classes/ |
Upload File : |
<?php
/* --------------------------------------------------------------
shopping_cart.php 2019-07-05
Gambio GmbH
http://www.gambio.de
Copyright (c) 2019 Gambio GmbH
Released under the GNU General Public License (Version 2)
[http://www.gnu.org/licenses/gpl-2.0.html]
--------------------------------------------------------------
based on:
(c) 2000-2001 The Exchange Project (earlier name of osCommerce)
(c) 2002-2003 osCommerce(shopping_cart.php,v 1.32 2003/02/11); www.oscommerce.com
(c) 2003 nextcommerce (shopping_cart.php,v 1.21 2003/08/17); www.nextcommerce.org
(c) 2003 XT-Commerce - community made shopping http://www.xt-commerce.com ($Id: shopping_cart.php 1534 2006-08-20 19:39:22Z mz $)
Released under the GNU General Public License
-----------------------------------------------------------------------------------------
Third Party contributions:
Customers Status v3.x (c) 2002-2003 Copyright Elari elari@free.fr | www.unlockgsm.com/dload-osc/ | CVS : http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/elari/?sortby=date#dirlist
Credit Class/Gift Vouchers/Discount Coupons (Version 5.10)
http://www.oscommerce.com/community/contributions,282
Copyright (c) Strider | Strider@oscworks.com
Copyright (c Nick Stanko of UkiDev.com, nick@ukidev.com
Copyright (c) Andre ambidex@gmx.net
Copyright (c) 2001,2002 Ian C Wilson http://www.phesis.org
Released under the GNU General Public License
--------------------------------------------------------------------------------------- */
// include needed functions
require_once (DIR_FS_INC . 'xtc_create_random_value.inc.php');
require_once (DIR_FS_INC . 'xtc_get_prid.inc.php');
require_once (DIR_FS_INC . 'xtc_draw_form.inc.php');
require_once (DIR_FS_INC . 'xtc_draw_input_field.inc.php');
require_once (DIR_FS_INC . 'xtc_image_submit.inc.php');
require_once (DIR_FS_INC . 'xtc_get_tax_description.inc.php');
require_once DIR_FS_INC . 'update_customer_b2b_status.inc.php';
class shoppingCart_ORIGIN
{
const INVALID_MIN_ORDER_QUANTITY = 1;
const INVALID_GRADUATED_QUANTITY = 2;
const INVALID_PRODUCT_ID = 3;
const COMBI_PRODUCT_PATTERN = '#\d+x\d+#';
/**
* @var array
*/
protected $error_data = [];
var $contents, $total, $weight, $cartID, $content_type;
public function __construct()
{
$this->reset();
}
function restore_contents()
{
if(!isset($_SESSION['customer_id']))
{
return false;
}
// insert current cart contents in database
if(is_array($this->contents))
{
reset($this->contents);
foreach($this->contents as $products_id => $value)
{
$qty = $this->contents[$products_id]['qty'];
$product_query = xtc_db_query("select products_id from " . TABLE_CUSTOMERS_BASKET . " where customers_id = '" . $_SESSION['customer_id'] . "' and products_id = '" . xtc_db_input($products_id) . "'");
if(!xtc_db_num_rows($product_query))
{
$sql_data_array = array();
$sql_data_array['customers_id'] = $_SESSION['customer_id'];
$sql_data_array['products_id'] = xtc_db_input($products_id);
$sql_data_array['customers_basket_quantity'] = xtc_db_input($qty);
$sql_data_array['customers_basket_date_added'] = date('Ymd');
$this->wrapped_db_perform(__FUNCTION__, TABLE_CUSTOMERS_BASKET, $sql_data_array);
if(isset($this->contents[$products_id]['attributes']))
{
reset($this->contents[$products_id]['attributes']);
foreach($this->contents[$products_id]['attributes'] as $option => $value)
{
$sql_data_array = array();
$sql_data_array['customers_id'] = $_SESSION['customer_id'];
$sql_data_array['products_id'] = xtc_db_input($products_id);
$sql_data_array['products_options_id'] = xtc_db_input($option);
$sql_data_array['products_options_value_id'] = xtc_db_input($value);
$this->wrapped_db_perform(__FUNCTION__, TABLE_CUSTOMERS_BASKET_ATTRIBUTES, $sql_data_array);
}
}
}
else
{
$sql_data_array = array();
$sql_data_array['customers_basket_quantity'] = xtc_db_input($qty);
$this->wrapped_db_perform(__FUNCTION__, TABLE_CUSTOMERS_BASKET, $sql_data_array, 'update', 'customers_id = \'' . $_SESSION['customer_id'] . '\' AND products_id = \'' . xtc_db_input($products_id) . '\'');
}
}
}
// reset per-session cart contents, but not the database contents
$this->reset(false);
$products_query = xtc_db_query("select products_id, customers_basket_quantity from " . TABLE_CUSTOMERS_BASKET . " where customers_id = '" . $_SESSION['customer_id'] . "'");
while($products = xtc_db_fetch_array($products_query))
{
// BOF GM_MOD
$t_gm_products_id = xtc_get_prid($products['products_id']);
$t_gm_check_status = xtc_db_query("SELECT
products_status,
gm_price_status,
group_permission_" . (int)$_SESSION['customers_status']['customers_status_id'] . " AS permission
FROM " . TABLE_PRODUCTS . "
WHERE products_id = '" . (int)$t_gm_products_id . "'");
if(xtc_db_num_rows($t_gm_check_status) == 1)
{
$t_gm_status = xtc_db_fetch_array($t_gm_check_status);
if((GROUP_CHECK === 'false' || $t_gm_status['permission'] === '1') && $t_gm_status['products_status'] == 1 && (int)$t_gm_status['gm_price_status'] == 0)
{
$this->contents[$products['products_id']] = array('qty' => $products['customers_basket_quantity']);
// attributes
$attributes_query = xtc_db_query("select products_options_id, products_options_value_id from " . TABLE_CUSTOMERS_BASKET_ATTRIBUTES . " where customers_id = '" . $_SESSION['customer_id'] . "' and products_id = '" . xtc_db_input($products['products_id']) . "'");
while($attributes = xtc_db_fetch_array($attributes_query))
{
$this->contents[$products['products_id']]['attributes'][$attributes['products_options_id']] = $attributes['products_options_value_id'];
}
// assign a temporary unique ID to the order contents to prevent hack attempts during the checkout procedure
$this->cartID = $this->generate_cart_id();
}
else
{
$this->remove($products['products_id']);
}
}
// EOF GM_MOD
}
$this->cleanup();
}
function reset($reset_database = false)
{
$this->contents = array();
$this->total = 0;
$this->weight = 0;
$this->content_type = false;
if(isset($_SESSION['customer_id']) && ($reset_database == true))
{
$this->wrapped_db_perform(__FUNCTION__, TABLE_CUSTOMERS_BASKET, array(), 'delete', 'customers_id = \'' . $_SESSION['customer_id'] . '\'');
$this->wrapped_db_perform(__FUNCTION__, TABLE_CUSTOMERS_BASKET_ATTRIBUTES, array(), 'delete', 'customers_id = \'' . $_SESSION['customer_id'] . '\'');
}
unset($this->cartID);
if(isset($_SESSION['cartID']))
{
unset($_SESSION['cartID']);
}
}
function add_cart($products_id, $qty = '1', $attributes = '', $notify = true, $p_products_properties_combis_id = 0)
{
global $new_products_id_in_cart;
if(!$this->allowed_quantity($products_id, $qty))
{
return false;
}
if(!preg_match('/[0-9]+\{[0-9]+\}[0-9{}]*x[0-9]+/', $products_id))
{
#GM_MOD:properties BOF
$c_products_properties_combis_id = (int)$p_products_properties_combis_id;
if($c_products_properties_combis_id == 0) #no combis_id given?
{
$coo_properties_control = MainFactory::create_object('PropertiesControl'); #check products_id for integrated combis_id
$t_combis_id = $coo_properties_control->extract_combis_id($products_id);
if($t_combis_id != '')
{
if(!$coo_properties_control->combi_exists(xtc_get_prid($products_id), $t_combis_id))
{
return false;
}
$c_products_properties_combis_id = $t_combis_id;
}
}
$products_id = xtc_get_uprid($products_id, $attributes, $c_products_properties_combis_id);
#GM_MOD:properties EOF
}
if($notify == true)
{
$_SESSION['new_products_id_in_cart'] = $products_id;
}
if($this->in_cart($products_id))
{
$this->update_quantity($products_id, $qty, $attributes);
}
else
{
$this->contents[$products_id] = array('qty' => $qty);
// insert into database
if(isset($_SESSION['customer_id']))
{
$sql_data_array = array();
$sql_data_array['customers_id'] = $_SESSION['customer_id'];
$sql_data_array['products_id'] = xtc_db_input($products_id);
$sql_data_array['customers_basket_quantity'] = xtc_db_input($qty);
$sql_data_array['customers_basket_date_added'] = date('Ymd');
$this->wrapped_db_perform(__FUNCTION__, TABLE_CUSTOMERS_BASKET, $sql_data_array);
}
if(is_array($attributes))
{
reset($attributes);
foreach($attributes as $option => $value)
{
$this->contents[$products_id]['attributes'][$option] = $value;
// insert into database
if(isset($_SESSION['customer_id']))
{
$sql_data_array = array();
$sql_data_array['customers_id'] = $_SESSION['customer_id'];
$sql_data_array['products_id'] = xtc_db_input($products_id);
$sql_data_array['products_options_id'] = xtc_db_input($option);
$sql_data_array['products_options_value_id'] = xtc_db_input($value);
$this->wrapped_db_perform(__FUNCTION__, TABLE_CUSTOMERS_BASKET_ATTRIBUTES, $sql_data_array);
}
}
}
}
$this->cleanup();
// assign a temporary unique ID to the order contents to prevent hack attempts during the checkout procedure
$this->cartID = $this->generate_cart_id();
}
function update_quantity($products_id, $quantity = '', $attributes = '')
{
if(empty($quantity) || !$this->allowed_quantity($products_id, $quantity))
{
return true; // nothing needs to be updated if theres no quantity, so we return true..
}
$this->contents[$products_id] = array('qty' => $quantity);
// update database
if(isset($_SESSION['customer_id']))
{
$sql_data_array = array();
$sql_data_array['customers_basket_quantity'] = xtc_db_input($quantity);
$this->wrapped_db_perform(__FUNCTION__, TABLE_CUSTOMERS_BASKET, $sql_data_array, 'update', 'customers_id = \'' . $_SESSION['customer_id'] . '\' AND products_id = \'' . xtc_db_input($products_id) . '\'');
}
if(is_array($attributes))
{
reset($attributes);
foreach($attributes as $option => $value)
{
$this->contents[$products_id]['attributes'][$option] = $value;
// update database
if(isset($_SESSION['customer_id']))
{
$sql_data_array = array();
$sql_data_array['products_options_value_id'] = (int)$value;
$this->wrapped_db_perform(__FUNCTION__, TABLE_CUSTOMERS_BASKET_ATTRIBUTES, $sql_data_array, 'update', 'customers_id = \'' . $_SESSION['customer_id'] . '\' AND products_id = \'' . xtc_db_input($products_id) . '\' AND products_options_id = \'' . (int)$option . '\'');
}
}
}
// assign a temporary unique ID to the order contents to prevent hack attempts during the checkout procedure
$this->cartID = $this->generate_cart_id();
}
function cleanup()
{
reset($this->contents);
$propertiesControl = MainFactory::create_object('PropertiesControl');
foreach($this->contents as $key => $value)
{
// check if a product with combis still has these combis
if (preg_match(self::COMBI_PRODUCT_PATTERN, $key) !== 0) {
list($productId, $combiId) = explode('x', $key);
if (!$propertiesControl->combi_exists($productId, $combiId)) {
unset($this->contents[$key]);
continue;
}
}
// BOF GM_MOD:
if($this->contents[$key]['qty'] <= 0)
{
unset($this->contents[$key]);
// remove from database
if(xtc_session_is_registered('customer_id'))
{
$this->wrapped_db_perform(__FUNCTION__, TABLE_CUSTOMERS_BASKET, array(), 'delete', 'customers_id = \'' . $_SESSION['customer_id'] . '\' AND products_id = \'' . xtc_db_input($key) . '\'');
$this->wrapped_db_perform(__FUNCTION__, TABLE_CUSTOMERS_BASKET_ATTRIBUTES, array(), 'delete', 'customers_id = \'' . $_SESSION['customer_id'] . '\' AND products_id = \'' . xtc_db_input($key) . '\'');
}
}
}
$this->checkIfMinimumAmountIsReached();
$this->removeProductsWithUnavailablePrice();
}
function count_contents()
{ // get total number of items in cart
$total_items = 0;
if(is_array($this->contents))
{
reset($this->contents);
foreach($this->contents as $products_id => $value)
{
$total_items += $this->get_quantity($products_id);
}
}
return $total_items;
}
function get_quantity($products_id)
{
if(isset($this->contents[$products_id]))
{
return $this->contents[$products_id]['qty'];
}
else
{
return 0;
}
}
function in_cart($products_id)
{
if(isset($this->contents[$products_id]))
{
return true;
}
else
{
return false;
}
}
function remove($products_id)
{
// BOF GM_MOD:
unset($this->contents[$products_id]);
// remove from database
if(xtc_session_is_registered('customer_id'))
{
$this->wrapped_db_perform(__FUNCTION__, TABLE_CUSTOMERS_BASKET, array(), 'delete', 'customers_id = \'' . $_SESSION['customer_id'] . '\' AND products_id = \'' . xtc_db_input($products_id) . '\'');
$this->wrapped_db_perform(__FUNCTION__, TABLE_CUSTOMERS_BASKET_ATTRIBUTES, array(), 'delete', 'customers_id = \'' . $_SESSION['customer_id'] . '\' AND products_id = \'' . xtc_db_input($products_id) . '\'');
}
// assign a temporary unique ID to the order contents to prevent hack attempts during the checkout procedure
$this->cartID = $this->generate_cart_id();
}
function remove_all()
{
$this->reset();
}
function get_product_id_list()
{
$product_id_list = '';
if(is_array($this->contents))
{
reset($this->contents);
foreach($this->contents as $products_id => $value)
{
$product_id_list .= ', ' . $products_id;
}
}
return substr($product_id_list, 2);
}
function calculate()
{
global $xtPrice;
$this->total = 0;
$this->weight = 0;
$this->tax = array();
if(!is_array($this->contents))
{
return 0;
}
reset($this->contents);
foreach($this->contents as $products_id => $value)
{
$qty = $this->contents[$products_id]['qty'];
// products price
$product_query = xtc_db_query("select products_id, products_price, products_discount_allowed, products_tax_class_id, products_weight from " . TABLE_PRODUCTS . " where products_id='" . xtc_db_input(xtc_get_prid($products_id)) . "'");
if($product = xtc_db_fetch_array($product_query))
{
$products_price = $xtPrice->xtcGetPrice($products_id, $format = false, $qty, $product['products_tax_class_id'], $product['products_price'], 0, 0, true, true);
$this->total += $products_price * $qty;
# set combis weight
$t_properties_weight = $this->properties_weight($products_id, $product['products_weight']);
if($t_properties_weight == 0)
{
$t_properties_weight = $product['products_weight'];
}
$this->weight += ($qty * $t_properties_weight);
// attributes price
$attribute_price = 0;
if(isset($this->contents[$products_id]['attributes']))
{
reset($this->contents[$products_id]['attributes']);
foreach($this->contents[$products_id]['attributes'] as $option => $value)
{
$values = $xtPrice->xtcGetOptionPrice($product['products_id'], $option, $value);
$this->weight += $values['weight'] * $qty;
$this->total += $values['price'] * $qty;
$attribute_price+=$values['price'];
}
}
if($product['products_tax_class_id'] != 0)
{
if($_SESSION['customers_status']['customers_status_ot_discount_flag'] == 1)
{
$products_price_tax = $products_price - ($products_price / 100 * $_SESSION['customers_status']['customers_status_ot_discount']);
$attribute_price_tax = $attribute_price - ($attribute_price / 100 * $_SESSION['customers_status']['customers_status_ot_discount']);
}
$products_tax = $xtPrice->TAX[$product['products_tax_class_id']];
$products_tax_description = xtc_get_tax_description($product['products_tax_class_id']);
// price incl tax
if($_SESSION['customers_status']['customers_status_show_price_tax'] == '1')
{
if($_SESSION['customers_status']['customers_status_ot_discount_flag'] == 1)
{
$this->tax[$product['products_tax_class_id']]['value'] += ((($products_price_tax + $attribute_price_tax) / (100 + $products_tax)) * $products_tax) * $qty;
$this->tax[$product['products_tax_class_id']]['desc'] = sprintf(TAX_INFO_INCL, $products_tax . '%');
}
else
{
$this->tax[$product['products_tax_class_id']]['value'] += ((($products_price + $attribute_price) / (100 + $products_tax)) * $products_tax) * $qty;
$this->tax[$product['products_tax_class_id']]['desc'] = sprintf(TAX_INFO_INCL, $products_tax . '%');
}
}
// excl tax + tax at checkout
if($_SESSION['customers_status']['customers_status_show_price_tax'] == 0 && $_SESSION['customers_status']['customers_status_add_tax_ot'] == 1)
{
if($_SESSION['customers_status']['customers_status_ot_discount_flag'] == 1)
{
$this->tax[$product['products_tax_class_id']]['value'] += (($products_price_tax + $attribute_price_tax) / 100) * ($products_tax) * $qty;
$this->total+=(($products_price_tax + $attribute_price_tax) / 100) * ($products_tax) * $qty;
$this->tax[$product['products_tax_class_id']]['desc'] = sprintf(TAX_INFO_EXCL, $products_tax . '%');
}
else
{
$this->tax[$product['products_tax_class_id']]['value'] += (($products_price + $attribute_price) / 100) * ($products_tax) * $qty;
$this->total+= (($products_price + $attribute_price) / 100) * ($products_tax) * $qty;
$this->tax[$product['products_tax_class_id']]['desc'] = sprintf(TAX_INFO_EXCL, $products_tax . '%');
}
}
}
// round total value and total tax to avoid rounding problems if quantity is not an integer
if($qty != (int)$qty)
{
foreach($this->tax as $t_tax_class_id => $t_content_array)
{
$this->tax[$t_tax_class_id]['value'] = round($this->tax[$t_tax_class_id]['value'], 2);
}
$this->total = round($this->total, 2);
}
}
}
}
function attributes_price($products_id)
{
global $xtPrice;
if(isset($this->contents[$products_id]['attributes']))
{
reset($this->contents[$products_id]['attributes']);
foreach($this->contents[$products_id]['attributes'] as $option => $value)
{
$values = $xtPrice->xtcGetOptionPrice($products_id, $option, $value);
$attributes_price += $values['price'];
}
}
return $attributes_price;
}
function properties_weight($p_products_id, $p_old_weight) #parameter sample: 1x46
{
$t_output_weight = 0;
$coo_properties_control = MainFactory::create_object('PropertiesControl');
$t_combis_id = $coo_properties_control->extract_combis_id($p_products_id);
if($t_combis_id != '' && $coo_properties_control->combi_exists(xtc_get_prid($p_products_id), $t_combis_id))
{
$t_combis_weight = $coo_properties_control->get_properties_combis_weight($t_combis_id);
$coo_data_object = MainFactory::create_object('GMDataObject', array('products', array('products_id' => $p_products_id)));
if($coo_data_object->get_data_value('use_properties_combis_weight') == 0)
{
# 0 = keep old products_weight and add new combis_weight
$t_output_weight = $p_old_weight + $t_combis_weight;
}
else
{
# 1 = replace old products_weight and use new combis_weight only
$t_output_weight = $t_combis_weight;
}
}
//echo($t_output_weight).'x';
return $t_output_weight;
}
function get_products()
{
global $xtPrice, $main;
if(!is_array($this->contents))
{
return false;
}
$product = MainFactory::create('product', 0, $_SESSION['languages_id']);
$propertiesDataAgent = MainFactory::create_object('PropertiesDataAgent');
$products_array = array();
reset($this->contents);
foreach($this->contents as $products_id => $value)
{
if($this->contents[$products_id]['qty'] != 0 || $this->contents[$products_id]['qty'] != '')
{
$products_query = xtc_db_query("SELECT
p.products_id,
pd.products_name,
pd.checkout_information,
p.products_shippingtime,
p.products_image,
p.products_model,
p.products_price,
p.products_discount_allowed,
p.products_weight,
p.products_tax_class_id,
p.product_type,
p.products_vpe,
p.products_vpe_status,
p.products_vpe_value,
p.gm_min_order,
qud.quantity_unit_id,
qud.unit_name
FROM
" . TABLE_PRODUCTS . " p
LEFT JOIN " . TABLE_PRODUCTS_DESCRIPTION . " pd USING (products_id)
LEFT JOIN products_quantity_unit pqu USING (products_id)
LEFT JOIN quantity_unit_description qud ON (pqu.quantity_unit_id = qud.quantity_unit_id AND qud.language_id = '" . (int)$_SESSION['languages_id'] . "')
WHERE
p.products_id='" . xtc_db_input(xtc_get_prid($products_id)) . "' AND
pd.products_id = p.products_id AND
pd.language_id = '" . (int)$_SESSION['languages_id'] . "'");
if(xtc_db_num_rows($products_query) == 1)
{
$products = xtc_db_fetch_array($products_query);
$products_price = $xtPrice->xtcGetPrice($products_id, $format = false, $this->contents[$products_id]['qty'], $products['products_tax_class_id'], $products['products_price'], 0, 0, true, true);
# add attributes price
$products_price = $products_price + $this->attributes_price($products_id);
# set combis weight
$t_properties_weight = $this->properties_weight($products_id, $products['products_weight']);
if($t_properties_weight == 0)
{
$t_properties_weight = $products['products_weight'];
}
$vpeText = $product->getVPEtext($products, $products_price);
if($products['products_vpe_status'] == 1 && strpos($products_id, 'x') !== false)
{
$combisId = substr($products_id, strpos($products_id, 'x') + 1);
$combiData = $propertiesDataAgent->get_combis_full_struct($combisId, $_SESSION['languages_id']);
if($combiData['products_vpe_id'] != 0 && $combiData['vpe_value'] != 0 && $products_price > 0)
{
$vpeText = $xtPrice->xtcFormat($products_price * (1 / $combiData['vpe_value']), true)
. TXT_PER . $combiData['products_vpe_name'];
}
}
$products_array[] = array(
'id' => $products_id,
'name' => $products['products_name'],
'checkout_information' => $products['checkout_information'],
'model' => $products['products_model'],
'image' => $products['products_image'],
'price' => $products_price,
'vpe' => $vpeText,
'quantity' => $this->contents[$products_id]['qty'],
'weight' => $t_properties_weight,
'shipping_time' => $main->getShippingStatusName($products['products_shippingtime']),
'final_price' => ($products_price),
'tax_class_id' => $products['products_tax_class_id'],
'quantity_unit_id' => $products['quantity_unit_id'],
'unit_name' => $products['unit_name'],
'attributes' => $this->contents[$products_id]['attributes'],
'product_type' => $products['product_type'],
'min_order' => $products['gm_min_order']
);
}
}
}
return $products_array;
}
function count_products()
{
$count = array_map(function ($value)
{
return $value['quantity'];
}, $this->get_products());
return array_sum($count);
}
function show_total()
{
$this->calculate();
return $this->total;
}
public function checkIfMinimumAmountIsReached()
{
if (!is_array($this->contents)) {
return;
}
reset($this->contents);
foreach ($this->contents as $products_id => $value) {
$qty = $this->contents[$products_id]['qty'];
$product_query = xtc_db_query('SELECT `gm_min_order` FROM ' . TABLE_PRODUCTS . ' WHERE products_id = ' . xtc_db_input(xtc_get_prid($products_id)));
$product_min_order = xtc_db_fetch_array($product_query);
if ((float)$qty < (float)$product_min_order['gm_min_order']) {
$this->remove($products_id);
}
}
}
public function getTotalForMinMaxOrder() {
global $xtPrice;
$total = 0;
$tax = array();
if(!is_array($this->contents))
{
return 0;
}
reset($this->contents);
foreach($this->contents as $products_id => $value)
{
$qty = $this->contents[$products_id]['qty'];
// products price
$product_query = xtc_db_query("select products_id, products_price, products_discount_allowed, products_tax_class_id from " . TABLE_PRODUCTS . " where products_id='" . xtc_db_input(xtc_get_prid($products_id)) . "'");
if($product = xtc_db_fetch_array($product_query))
{
$products_price = $xtPrice->xtcGetPrice($products_id, $format = false, $qty, $product['products_tax_class_id'], $product['products_price'], 0, 0, true, true);
$total += $products_price * $qty;
// attributes price
$attribute_price = 0;
if(isset($this->contents[$products_id]['attributes']))
{
reset($this->contents[$products_id]['attributes']);
foreach($this->contents[$products_id]['attributes'] as $option => $optionValue)
{
$values = $xtPrice->xtcGetOptionPrice($product['products_id'], $option, $optionValue);
$total += $values['price'] * $qty;
$attribute_price += $values['price'];
}
}
if($product['products_tax_class_id'] != 0)
{
if($_SESSION['customers_status']['customers_status_ot_discount_flag'] == 1)
{
$products_price_tax = $products_price - ($products_price / 100 * $_SESSION['customers_status']['customers_status_ot_discount']);
$attribute_price_tax = $attribute_price - ($attribute_price / 100 * $_SESSION['customers_status']['customers_status_ot_discount']);
}
$products_tax = $xtPrice->TAX[$product['products_tax_class_id']];
// price incl tax
if($_SESSION['customers_status']['customers_status_show_price_tax'] == '1')
{
if($_SESSION['customers_status']['customers_status_ot_discount_flag'] == 1)
{
$tax[$product['products_tax_class_id']]['value'] += ((($products_price_tax + $attribute_price_tax) / (100 + $products_tax)) * $products_tax) * $qty;
$tax[$product['products_tax_class_id']]['desc'] = sprintf(TAX_INFO_INCL, $products_tax . '%');
}
else
{
$tax[$product['products_tax_class_id']]['value'] += ((($products_price + $attribute_price) / (100 + $products_tax)) * $products_tax) * $qty;
$tax[$product['products_tax_class_id']]['desc'] = sprintf(TAX_INFO_INCL, $products_tax . '%');
}
}
}
// round total value and total tax to avoid rounding problems if quantity is not an integer
if($qty != (int)$qty)
{
foreach($tax as $t_tax_class_id => $t_content_array)
{
$tax[$t_tax_class_id]['value'] = round($tax[$t_tax_class_id]['value'], 2);
}
$total = round($total, 2);
}
}
}
return $total;
}
function show_weight()
{
$this->calculate();
return $this->weight;
}
function show_tax($format = true)
{
global $xtPrice;
$this->calculate();
$output = "";
$val = 0;
foreach($this->tax as $key => $value)
{
if($this->tax[$key]['value'] > 0
|| (gm_get_conf('DISPLAY_0_PROCENT_TAX') === '1'
&& $this->tax[$key]['value'] >= 0)
)
{
$output .= $this->tax[$key]['desc'] . ": " . $xtPrice->xtcFormat($this->tax[$key]['value'], true) . "<br />";
$val += $this->tax[$key]['value'];
}
}
if($format)
{
return $output;
}
else
{
return $val;
}
}
function generate_cart_id($length = 5)
{
return xtc_create_random_value($length, 'digits');
}
function get_content_type()
{
$this->content_type = false;
if((DOWNLOAD_ENABLED == 'true') && ($this->count_contents() > 0))
{
reset($this->contents);
foreach($this->contents as $products_id => $value)
{
if($this->has_product_virtual_tax_class($products_id))
{
switch($this->content_type)
{
case 'physical' :
$this->content_type = 'mixed';
$this->update_session_customer_b2b_status();
return $this->content_type;
default :
$this->content_type = 'virtual';
continue(2);
}
}
if(isset($this->contents[$products_id]['attributes']))
{
reset($this->contents[$products_id]['attributes']);
foreach($this->contents[$products_id]['attributes'] as $value)
{
$virtual_check_query = xtc_db_query("select count(*) as total from " . TABLE_PRODUCTS_ATTRIBUTES . " pa, " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad where pa.products_id = '" . xtc_db_input($products_id) . "' and pa.options_values_id = '" . xtc_db_input($value) . "' and pa.products_attributes_id = pad.products_attributes_id");
$virtual_check = xtc_db_fetch_array($virtual_check_query);
if($virtual_check['total'] > 0)
{
switch($this->content_type)
{
case 'physical' :
$this->content_type = 'mixed';
$this->update_session_customer_b2b_status();
return $this->content_type;
break;
default :
$this->content_type = 'virtual';
break;
}
}
else
{
switch($this->content_type)
{
case 'virtual' :
$this->content_type = 'mixed';
$this->update_session_customer_b2b_status();
return $this->content_type;
break;
default :
$this->content_type = 'physical';
break;
}
}
}
}
else
{
switch($this->content_type)
{
case 'virtual' :
$this->content_type = 'mixed';
$this->update_session_customer_b2b_status();
return $this->content_type;
break;
default :
$this->content_type = 'physical';
break;
}
}
}
}
else
{
$this->content_type = 'physical';
}
$this->update_session_customer_b2b_status();
return $this->content_type;
}
function unserialize($broken)
{
foreach($broken as $key => $value)
{
$this->{$key} = $value;
}
}
// GV Code Start
// ------------------------ ICW CREDIT CLASS Gift Voucher Addittion-------------------------------Start
// amend count_contents to show nil contents for shipping
// as we don't want to quote for 'virtual' item
// GLOBAL CONSTANTS if NO_COUNT_ZERO_WEIGHT is true then we don't count any product with a weight
// which is less than or equal to MINIMUM_WEIGHT
// otherwise we just don't count gift certificates
function count_contents_non_virtual()
{ // get total number of items in cart disregard gift vouchers and downloads
$total_items = 0;
if(is_array($this->contents))
{
reset($this->contents);
foreach($this->contents as $products_id => $value)
{
$no_count = false;
$gv_query = xtc_db_query("select products_model from " . TABLE_PRODUCTS . " where products_id = '" . xtc_db_input($products_id) . "'");
$gv_result = xtc_db_fetch_array($gv_query);
if(preg_match('/^GIFT/', $gv_result['products_model']))
{
$no_count = true;
}
if(defined('NO_COUNT_ZERO_WEIGHT') && NO_COUNT_ZERO_WEIGHT == 1)
{
$gv_query = xtc_db_query("select products_weight from " . TABLE_PRODUCTS . " where products_id = '" . xtc_db_input(xtc_get_prid($products_id)) . "'");
$gv_result = xtc_db_fetch_array($gv_query);
if($gv_result['products_weight'] <= MINIMUM_WEIGHT)
{
$no_count = true;
}
}
// check if product is a download
if(isset($this->contents[$products_id]['attributes']))
{
reset($this->contents[$products_id]['attributes']);
foreach($this->contents[$products_id]['attributes'] as $value)
{
$virtual_check_query = xtc_db_query("select count(*) as total from " . TABLE_PRODUCTS_ATTRIBUTES . " pa, " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad where pa.products_id = '" . xtc_db_input($products_id) . "' and pa.options_values_id = '" . xtc_db_input($value) . "' and pa.products_attributes_id = pad.products_attributes_id");
$virtual_check = xtc_db_fetch_array($virtual_check_query);
if($virtual_check['total'] > 0)
{
$no_count = true;
}
}
}
if(!$no_count && !$this->has_product_virtual_tax_class($products_id))
{
$total_items += $this->get_quantity($products_id);
}
}
}
return $total_items;
}
protected function wrapped_db_perform($p_called_from, $p_table, $p_data_array = array(), $p_action = 'insert', $p_parameters = '', $p_link = 'db_link', $p_quoted_values = true)
{
return xtc_db_perform($p_table, $p_data_array, $p_action, $p_parameters, $p_link, $p_quoted_values);
}
// DEPRECATED (wrong method name)
function count_contents_virtual()
{
return $this->count_contents_non_virtual();
}
// ------------------------ ICW CREDIT CLASS Gift Voucher Addittion-------------------------------End
//GV Code End
/**
* Check if product has tax class with "EEL" as tax class description
* @param int $p_products_id
* @return bool is virtual
*/
protected function has_product_virtual_tax_class($p_products_id)
{
$c_products_id = (int)$p_products_id;
$t_query = 'SELECT p.products_tax_class_id
FROM
products p ,
tax_class t
WHERE
p.products_id = ' . $c_products_id . ' AND
p.products_tax_class_id = t.tax_class_id AND
t.tax_class_description LIKE "EEL%"';
$t_result = xtc_db_query($t_query);
$t_is_virtual = xtc_db_num_rows($t_result) == true;
return $t_is_virtual;
}
protected function update_session_customer_b2b_status()
{
$c_address_book_id = 0;
if(isset($_SESSION['billto']) && $this->content_type === 'virtual')
{
$c_address_book_id = (int)$_SESSION['billto'];
if(isset($_SESSION['sendto']))
{
$_SESSION['sendto'] = $_SESSION['billto'];
}
}
elseif(isset($_SESSION['sendto']))
{
$c_address_book_id = (int)$_SESSION['sendto'];
}
if($c_address_book_id !== 0)
{
$t_query = 'SELECT customer_b2b_status FROM address_book WHERE address_book_id = ' . $c_address_book_id;
$t_result = xtc_db_query($t_query);
if(xtc_db_num_rows($t_result))
{
$t_row = xtc_db_fetch_array($t_result);
update_customer_b2b_status($t_row['customer_b2b_status']);
}
}
}
protected function allowed_quantity($p_products_id, $p_quantity)
{
$get_products_data = xtc_db_query("SELECT gm_min_order, gm_graduated_qty FROM products WHERE products_id = '" . (int)$p_products_id . "'");
if(xtc_db_num_rows($get_products_data) == 1)
{
$products_data = xtc_db_fetch_array($get_products_data);
$products_data['gm_min_order'] = empty($products_data['gm_min_order']) ? 1 : (double)$products_data['gm_min_order'];
$products_data['gm_graduated_qty'] = (empty($products_data['gm_graduated_qty']) || $products_data['gm_graduated_qty'] <= 0) ? 1 : (double)$products_data['gm_graduated_qty'];
if($p_quantity < $products_data['gm_min_order'])
{
$this->error_data[$p_products_id] = ['code' =>self::INVALID_MIN_ORDER_QUANTITY,
'min_order' => $products_data['gm_min_order']
];
return false;
}
$result = $p_quantity / $products_data['gm_graduated_qty'];
$result = round($result, 4); // workaround for next if-case to avoid calculating failure
if((int)$result != $result)
{
$this->error_data[$p_products_id] = ['code' =>self::INVALID_GRADUATED_QUANTITY,
'graduated_qty'=> $products_data['gm_graduated_qty']
];
return false;
}
return true;
}
$this->error_data = ['code' =>self::INVALID_PRODUCT_ID,
'product_id'=> $p_products_id
];
return false;
}
/**
*
*/
protected function removeProductsWithUnavailablePrice(): void
{
global $xtPrice;
foreach($this->contents as $products_id => $value) {
$price = $xtPrice->xtcGetPrice($products_id,$format = false, $this->contents[$products_id]['qty'], 0, 0);
if (is_string($price)) { #if the price is unavailable for the customer group the result is the customer message
unset($this->contents[$products_id]);
}
}
}
public function get_errors() {
return $this->error_data;
}
public function wipe_error_data()
{
$this->error_data = [];
}
}